前几篇了解完从请求到响应的流程后,仔细学习下路由和中间件的玩法
----------------------------------分割线--------------------------------
路由
基本用法可以参考中文文档的路由,要注意的是
1)$app要换成$route
2)namespace不需要写全,5.5新版本会自动把前面的那部分补全
上一下基本例子:
//当路由为api.com/index.php/user/1/hano/2时,
//由ExampleController的show方法响应请求
$router->get('user/{id}/{name}/{sex}', 'ExampleController@show');
//as键值对可以对此路由进行命名,uses指定响应操作
//as的作用有利于生成重定向的URL:redirect()->route('profile');
//middlerware中间件提供了一个方便的机制来过滤进入应用程序的 HTTP 请求
**使用中间件要先在app.php中打开routeMiddleware代码的注释进行注册中间件**
// $app->routeMiddleware([
// 'auth' => App\Http\Middleware\Authenticate::class,
// 'validate' => App\Http\Middleware\validateMiddle::class,
// 'before' => App\Http\Middleware\beforeMiddle::class,
// 'after' => App\Http\Middleware\afterMiddle::class,
// ]);
$router->get('getUrl/{str}', [
'as' => 'profile',
'uses' => 'ExampleController@getUrl',
'middleware' => 'auth'
]);
//路由群组可以为多个路由设置共同属性,而不需在每个路由上都设置一次
//namespace命名空间将匹配到的路由给到App\Http\Controllers\User\下的控制器处理
//prefix路由前缀匹配到的路由为api.com/index.php/admin/{路由名称}
//middleware此组路由都会先经过validate中间件
$router->group([
'namespace' => 'User',
'prefix' => 'admin',
'middleware => 'validate'
],function() use ($router) {
$router->get('getUserInfo/{user_id}', [
'as' => 'getUserInfo',
'uses' => 'UserController@getUserInfo'
]);
$router->post('updateUserInfo/{user_id}', [
'as' => 'updateUserInfo',
'uses' => 'UserController@updateUserInfo'
]);
});
中间件
中间件文件都放在app/http/Middleware文件夹中,可以根据ExampleMiddleware.php进行创建
中间件分前置和后置两种
前置中间件
namespace App\Http\Middleware;
use Closure;
class BeforeMiddleware
{
//第三个参数为额外传参
public function handle($request, Closure $next, $name)
{
//前置中间件,在执行路由定义指定的操作前做你想做的事情
var_dump($name);
return $next($request);
}
}
后置中间件
<?php
namespace App\Http\Middleware;
use Closure;
class AfterMiddleware
{
//第三个参数为额外传参
public function handle($request, Closure $next, $name)
{
$response = $next($request);
//后置中间件,在执行完路由定义指定的操作后(也就是响应前)做你想做的事情
var_dump($name);
return $response;
}
}
路由可指示多个中间件,用数组形式表达
附加的中间件参数将会在 $next 参数之后被传入中间件,用法:
//在路由中使用冒号 : 来区隔中间件名称与指派参数,多个参数可使用逗号作为分隔
$router->get('getUrl/{str}', [
'as' => 'profile',
'uses' => 'ExampleController@getUrl',
'middleware' => ['before:hano','after:hano'] //hano将为$name的值
]);
全局中间件
每个 HTTP 请求都经过一个中间件,只要将中间件的类加入到 bootstrap/app.php 的 $app->middleware() 调用参数数组中。
$app->middleware([
App\Http\Middleware\Authenticate::class,
]);
Terminable中间件
有些时候中间件需要在 HTTP 响应被发送到浏览器之后才运行,例如,「session」中间件存储的 session 数据是在响应被发送到浏览器之后才进行写入的。想要做到这一点,你需要定义中间件为「terminable」。
<?php
namespace Illuminate\Session\Middleware;
use Closure;
class StartSession
{
public function handle($request, Closure $next)
{
return $next($request);
}
public function terminate($request, $response)
{
// 保存 session 数据...
}
}
terminate 方法必须接收请求($request)及响应($response)两个参数。一旦定义了 terminable 中间件,你便需要将它增加到 bootstrap/app.php 文件的全局中间件清单列表中。
$app->middleware([
App\Http\Middleware\Authenticate::class,
App\Http\Middleware\terminable::class,
]);
当在你的中间件调用 terminate 方法时,Lumen 会从 服务容器 解析一个全新的中间件实例。
如果你希望在 handle 及 terminate 方法被调用时使用一致的中间件实例,只需在容器中使用容器的 singleton 方法注册中间件
$app->singleton(
App\Http\Middleware\terminable::class
);
以上就是路由和中间件的学习,最后那terminable那part其实理解得有点虚,有错记得指出修正,谢谢
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。