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

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

发布于 2018-05-04 阅读 399 次 框架 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请求服务器删除指定的页面。
CONNECTHTTP/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)

命名空间

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

$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
});