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

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

发布于 2018-05-04 阅读 1215 次 框架 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`末尾我们可以找到: /* |-------------------------------------------------------------------------- | Load The Application Routes |-------------------------------------------------------------------------- | | Next we will include the routes file so that they can all be added to | the application. This will provide all of the URLs the application | can respond to, as well as the controllers that may handle them. | */ $app->router->group([ 'namespace' => 'App\Http\Controllers', ], function ($router) { require __DIR__.'/../routes/web.php'; }); return $app; 通过这一段可以看到,它是加载了 `routes` 下的 `web.php` 路由文件并设置了它的默认命名空间为 `App\Http\Controllers` 所以,如果我们项目有多个模块比如 后台模块(admin),接口模块(api)都可以在这里注册加载。做到路由分组,有利于我们后期对路由的管理和维护 // 注册加载 Admin 模块 $app->router->group([ 'namespace' => 'App\Http\Controllers\Admin', ], function ($router) { require __DIR__.'/../routes/admin.php'; }); **新添加路由文件注册,记得先在 `routes` 下新建对应路由文件** ### 定义路由 $router->get('/post/{id}', 'PostController@Show'); // 通过 id 获取对应 id 文章,并指向 PostController 下的 show 方法 // http://localhost/post/1 $router->post('/post', 'PostController@Save'); // 新添加一篇文章 // http://localhost/post $router->delete('/post', 'PostController@Destroy'); // 删除一篇文章 // http://localhost/post $router->put('/post', 'PostController@Edit'); // 更新一篇文章 // http://localhost/post **正则匹配** 假如希望 url 中的 id 只能是数字 $router->get('/post/{id:[0-9]+}', 'PostController@Show'); // http://localhost/post/abc 将会提示 404 可以通过参数后面跟 `:reg` 进行正则匹配 ### 路由群组 **中间件** 可以查看 [开始使用Lumen吧 - 中间件(Middleware)](https://www.w2le.com/p/54 "开始使用Lumen吧 - 中间件(Middleware)") **命名空间** 在路由注册时候,我们已经设置好了默认命名空间,如果需要对某个路由单独配置命名空间: $router->group(['namespace' => 'Common'], function() use ($router) { $router->get('/post/{id}', 'PostController@Show'); // 会访问 "App\Http\Controllers\Common" 下的 PostController }); 命名空间可以相互嵌套 $router->group(['namespace' => 'Common'], function() use ($router) { // 会访问 "App\Http\Controllers\Common" 下的 Controller $router->group(['namespace' => 'Admin'], function() use ($router) { // 会访问 "App\Http\Controllers\Common\Admin" 下的 Controller }); }); 如果想当前命名空间不继承上一层的命名空间,可以在命名空间前面加 `\` **路由前缀** 这是一个非常实用的功能,同时也能减少一部分路由的编写工作量 //后台文章管理模块 $router->group(['prefix' => 'admin'], function () use ($router) { $router->get('/post/{id}', 'PostController@Show'); // http://localhost/admin/post/1 $router->post('/post', 'PostController@Save'); // http://localhost/admin/post $router->delete('/post', 'PostController@Destroy'); // http://localhost/admin/post $router->put('/post', 'PostController@Edit'); // http://localhost/admin/post });