路由与控制器

路由

Blink 默认的路由配置位于 src/http/routes.php 文件中,该文件返回一个数组,包含应用所有的路由定义。 下面是一个简单的路由配置文件:

  1. <?php
  2. return [
  3. ['GET', '/', function () {
  4. return 'hello world';
  5. }],
  6. ['GET', '/foo/bar', function () {
  7. return 'hello foo bar';
  8. }]
  9. ];

路由的定义也支持指定多个 HTTP 请求方法(HTTP Method),实例如下:

  1. return [
  2. [['GET', 'HEAD'], '/', function () {
  3. // 该路径下的 GET 和 HEAD 请求都将由该函数处理
  4. return 'hello world';
  5. }]
  6. ];

带参数的路由

路由的定义也可以携带参数,我们使用{param} 的语法来定义一个参数,其中param是参数的名称,控制器函数需要按顺序接受 框架传递过来的参数。如下的例子中定义了 type 和 id 两个参数:

  1. return [
  2. ['GET', '/users/{type}/{id}', function ($type, $id) {
  3. // 路由中定义的参数可以直接在控制器函数或方法中获取
  4. }]
  5. ];

上面的例子没有对 type 和 id 参数做任何限制,实际上下面这些 URL 都能通过该路由的校验:

  1. /users/foo/123
  2. /users/321/bar
  3. /users/foo/bar

但实际上我们可以只希望 /users/foo/123 通过检验,这时我们可以使用正则表达式限制每个参数的值,其对应的语法是{param:expression}, 下面的路由定义就符合我们的预期:

  1. return [
  2. ['GET', '/users/{type:[a-zA-Z]+}/{id:\d+}', function ($type, $id) {
  3. // 现在的 type 就限定为字符串, id 限定为整数了
  4. }]
  5. ];

控制器

控制器函数除了上文中使用的匿名函数,更常见的是使用类的方法。我们使用 ClassName@method 这样的语法指定类方法作为控制器函数,如:

  1. return [
  2. ['GET', '/', '/app/http/controllers/IndexController@index']
  3. ];

该示例中我们采用了类的绝对命名空间,这个看起来会比较繁琐,这是我们可以结合 src/config/app.php 中的controllerNamespace 配置,采用相对的命名空间格式,简化代码。结合两者,下面示例达到的效果将完全一致:

src/config/app.php

  1. return [
  2. 'controllerNamespace' => '\app\http\controllers',
  3. ];

src/http/routes.php

  1. return [
  2. ['GET', '/', 'IndexController@index']
  3. ];

依赖注入

Blink 支持控制器的构造函数和普通方法两种注入方式。通过依赖注入,我们可以很方便的把需要的对象拿来使用,而不用关心这些对象是怎么创建的, 框架本身自然会很好的处理好对象的创建。下面是一个简单的控制器注入案例:

  1. use blink\core\Object;
  2. use blink\http\Request;
  3. class Controller extends Object
  4. {
  5. /**
  6. * 这里通过构造函数注入 Request 对象
  7. */
  8. public function __construct(Request $request, $config = [])
  9. {
  10. parent::__construct();
  11. }
  12. /**
  13. * 这里在普通方法中注 Request 对象
  14. *
  15. * @param $id 路由参数 id 的值,注意路由参数需要放在参数列表的前面
  16. * @param $request 注入的 Request 对象
  17. */
  18. public function index($id, Request $request)
  19. {
  20. }
  21. }