当前位置:首页 > 开始使用Lumen吧 - 路由(Routing)

开始使用Lumen吧 - 路由(Routing)

发布于 2018-05-04 阅读 1617 次 框架 Lumen PHP

路由,是 Lumen 非常强大的一部分
现在很多框架是通过modules/controller/action 模块,控制器,动作来匹配路由的。Lumen 不同的是需要手动指定路由映射关系。可能对于刚接触这种方式的人来说会感到不习惯,麻烦。

没关系,等熟悉之后就会体会到这种自定义路由方式带来的好处。

HTTP 请求不只有 GET / POST

有可能很多人多会认为 HTTP 请求只有 GET / POST 两种方法。GET 来做查询,POST 做修改。其实根据HTTP标准,HTTP请求可以使用多种请求方法:

HTTP1.0定义了三种请求方法:GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

方法 描述
GET 请求指定的页面信息,并返回实体主体。
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。

咱们可以通过文章来举例:

方法 描述
GET 用来获取文章详情/文章列表
POST 用来添加一篇新的文章
PUT / PATCH 修改某一篇文章
DELETE 删除某一篇文章

通过 POST,DELETE,PUT,GET 四个方法刚好对应我们文章的 增,删,改,查

PUT 与 PATCH 的区别,这两都是用作更新资源:

  • PUT: 会修改当前资源的所有属性值
  • PATCH:只会更改提交值

修改文章时候,用户只提交了 title 参数,如果用 PUT 会同步修改 title 值,而其他未提交的值会被设置为空;PATCH 反之,只会修改当前提交的值 title ,其他值保持不变

路由文件加载

app/bootstrap/app.php末尾我们可以找到:

  1. /*
  2. |--------------------------------------------------------------------------
  3. | Load The Application Routes
  4. |--------------------------------------------------------------------------
  5. |
  6. | Next we will include the routes file so that they can all be added to
  7. | the application. This will provide all of the URLs the application
  8. | can respond to, as well as the controllers that may handle them.
  9. |
  10. */
  11. $app->router->group([
  12. 'namespace' => 'App\Http\Controllers',
  13. ], function ($router) {
  14. require __DIR__.'/../routes/web.php';
  15. });
  16. return $app;

通过这一段可以看到,它是加载了 routes 下的 web.php 路由文件并设置了它的默认命名空间为 App\Http\Controllers
所以,如果我们项目有多个模块比如 后台模块(admin),接口模块(api)都可以在这里注册加载。做到路由分组,有利于我们后期对路由的管理和维护

  1. // 注册加载 Admin 模块
  2. $app->router->group([
  3. 'namespace' => 'App\Http\Controllers\Admin',
  4. ], function ($router) {
  5. require __DIR__.'/../routes/admin.php';
  6. });

新添加路由文件注册,记得先在 routes 下新建对应路由文件

定义路由

  1. $router->get('/post/{id}', 'PostController@Show');
  2. // 通过 id 获取对应 id 文章,并指向 PostController 下的 show 方法
  3. // http://localhost/post/1
  4. $router->post('/post', 'PostController@Save');
  5. // 新添加一篇文章
  6. // http://localhost/post
  7. $router->delete('/post', 'PostController@Destroy');
  8. // 删除一篇文章
  9. // http://localhost/post
  10. $router->put('/post', 'PostController@Edit');
  11. // 更新一篇文章
  12. // http://localhost/post

正则匹配

假如希望 url 中的 id 只能是数字

  1. $router->get('/post/{id:[0-9]+}', 'PostController@Show');
  2. // http://localhost/post/abc 将会提示 404

可以通过参数后面跟 :reg 进行正则匹配

路由群组

中间件

可以查看 开始使用Lumen吧 - 中间件(Middleware)

命名空间

在路由注册时候,我们已经设置好了默认命名空间,如果需要对某个路由单独配置命名空间:

  1. $router->group(['namespace' => 'Common'], function() use ($router)
  2. {
  3. $router->get('/post/{id}', 'PostController@Show');
  4. // 会访问 "App\Http\Controllers\Common" 下的 PostController
  5. });

命名空间可以相互嵌套

  1. $router->group(['namespace' => 'Common'], function() use ($router)
  2. {
  3. // 会访问 "App\Http\Controllers\Common" 下的 Controller
  4. $router->group(['namespace' => 'Admin'], function() use ($router) {
  5. // 会访问 "App\Http\Controllers\Common\Admin" 下的 Controller
  6. });
  7. });

如果想当前命名空间不继承上一层的命名空间,可以在命名空间前面加 \

路由前缀

这是一个非常实用的功能,同时也能减少一部分路由的编写工作量

  1. //后台文章管理模块
  2. $router->group(['prefix' => 'admin'], function () use ($router) {
  3. $router->get('/post/{id}', 'PostController@Show');
  4. // http://localhost/admin/post/1
  5. $router->post('/post', 'PostController@Save');
  6. // http://localhost/admin/post
  7. $router->delete('/post', 'PostController@Destroy');
  8. // http://localhost/admin/post
  9. $router->put('/post', 'PostController@Edit');
  10. // http://localhost/admin/post
  11. });