lumen5.5学习路由和中间件(四)

前几篇了解完从请求到响应的流程后,仔细学习下路由和中间件的玩法

----------------------------------分割线--------------------------------

路由

基本用法可以参考中文文档的路由,要注意的是
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其实理解得有点虚,有错记得指出修正,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值