前几篇了解完从请求到响应的流程后,仔细学习下路由和中间件的玩法php
----------------------------------分割线--------------------------------laravel
基本用法能够参考中文文档的路由,要注意的是
1)$app要换成$route
2)namespace不须要写全,5.5新版本会自动把前面的那部分补全
上一下基本例子:bootstrap
//当路由为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进行建立
中间件分前置和后置两种api
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, ]);
有些时候中间件须要在 HTTP 响应被发送到浏览器以后才运行,例如,「session」中间件存储的 session 数据是在响应被发送到浏览器以后才进行写入的。想要作到这一点,你须要定义中间件为「terminable」。session
<?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
$app->middleware([ App\Http\Middleware\Authenticate::class, App\Http\Middleware\terminable::class, ]);
当在你的中间件调用 terminate 方法时,Lumen 会从 服务容器 解析一个全新的中间件实例。post
若是你但愿在 handle 及 terminate 方法被调用时使用一致的中间件实例,只需在容器中使用容器的 singleton 方法注册中间件学习
$app->singleton( App\Http\Middleware\terminable::class );
以上就是路由和中间件的学习,最后那terminable那part其实理解得有点虚,有错记得指出修正,谢谢