ThinkPHP 中介軟體

zs4336發表於2019-12-18

ThinkPHP 中介軟體

中介軟體主要用於攔截或過濾應用的HTTP請求,並進行必要的業務處理,在TP中主要分為:路由中介軟體,控制器中介軟體,全域性中介軟體,模組中介軟體等。但其中需要注意的點是中介軟體handle方法的返回值必須是一個Response物件,在某些需求下,可以使用handle方法的第三個引數傳入額外的引數。當然也可以給中介軟體起別名(路由中介軟體和控制器中介軟體會用的到)。

下面我以跨域中介軟體為例

定義中介軟體

定義CrossDomain.php

<?php

namespace app\http\middleware;

use app\common\exception\ParamException;
use think\facade\Config;
use think\Request;

class CrossDomain
{
    /**
     * @param Request $request
     * @param \Closure $next
     * @return mixed|\think\Response
     * @throws ParamException
     */
    public function handle(Request $request, \Closure $next)
    {
        $origin = $request->header('origin');
        $origin = $origin ? $origin : $request->domain();

        $whiteList = Config::get('cross_domain.whiteList',[]);

        if ( ! in_array($origin, $whiteList) ) {
            throw new ParamException(['errMsg'=>'跨域請求不在白名單中']);
        }

        header('Access-Control-Allow-Origin:'.$origin);
        header('Access-Control-Max-Age:3600');
        header('Access-Control-Allow-Methods:GET, POST, OPTIONS');
        header('Access-Control-Allow-Headers:X-Requested-With, Content-Type, Accept, Origin, Authorization, X-TOKEN');

        if (strtoupper($request->method()) == "OPTIONS") {
            return response()->header('Content-Length',0);
        }

        return $next($request);
    }
}

註冊中介軟體

中介軟體的註冊應該使用完整的類名,如果沒有指定名稱空間則使用app\http\middleware作為名稱空間,跨域中介軟體屬於全域性中介軟體,故在專案應用目錄下建立middleware.php檔案進行註冊。

return [
    \app\http\middleware\CrossDomain::class,
];

路由中介軟體,控制器中介軟體和模組中介軟體在此就不解釋了,具體的可以檢視官方手冊。

趁還沒掉光,趕緊給每根頭髮起個名字吧~

相關文章