国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

簡單實(shí)現(xiàn)webman類似tp在控制器中定義中間件

kyour

webman不支持在控制器中定義中間件,因?yàn)檫w移tp代碼自己實(shí)現(xiàn)了控制器中間件支持,分享同時也請大家指點(diǎn)指點(diǎn)。
貼代碼:
首先創(chuàng)建自己的控制器中間件接口

<?php

namespace app\common\middleware;

use Webman\Http\Request;
use Webman\Http\Response;

interface ControllerMiddlewareInterface
{

    /**
     * 控制器專用中間件接口
     */
    public function process(Request $request): ?Response;

}

創(chuàng)建webman中間件以調(diào)用自己的控制器中間件

<?php

namespace app\common\middleware;

use Webman\Http\Request;
use Webman\Http\Response;
use Webman\MiddlewareInterface;

class ControllerMiddleware implements MiddlewareInterface
{

    /**
     * 實(shí)現(xiàn)控制器中間件處理
     * @param Request $request
     * @param callable $handler
     * @return Response
     */
    public function process(Request $request, callable $handler) : Response
    {
        $controllerClass = $request->controller;

        try{
            $middlewareConfig = $controllerClass::middleware;
        }catch (\Throwable $e){
            //沒有定義控制器中間件
            $middlewareConfig = [];
        }
        if($middlewareConfig){
            //如果存在中間件,則調(diào)用控制器中間件
            foreach ($middlewareConfig as $middlewareClass) {
                /**
                 * @var ControllerMiddlewareInterface $middleware
                 */
                $middleware = new $middlewareClass();

                //調(diào)用中間件,若有響應(yīng)則中斷請求
                if($res = $middleware->process($request)){
                    return $res;
                }
            }
        }

        return $handler($request);
    }
}

實(shí)現(xiàn)一個控制器中間件,demo如下

<?php

namespace app\common\middleware;

use Webman\Http\Request;
use Webman\Http\Response;

/**
 * 鑒權(quán)中間件
 */
class AuthMiddleware implements ControllerMiddlewareInterface
{

    /**
     * @param Request $request
     * @return Response
     */
    public function process(Request $request) : ?Response
    {
        if($request->isAjax()){
            return new Response(200, [], '不允許ajax提交');
        }

        return null;
    }
}

將實(shí)現(xiàn)的控制器中間件添加到控制器中

<?php
namespace plugin\admin\app\controller;

use app\BaseController;

class Index extends BaseController
{
    /**
     * 控制器中間件
     */
    const middleware = [
        \app\common\middleware\AuthMiddleware::class
    ];

    public function index()
    {
        return "hello admin.";
    }
}

最后,將webman中間件添加到配置中(middleware.php)

<?php
use App\common\middleware\ControllerMiddleware;

return [
    '' => [
        //...你的其他中間件配置

        //控制器中間件
        ControllerMiddleware::class

    ]
];
1835 2 0
2個評論

admin
  • Tinywan 2023-02-02

    哈哈

  • kyour 2023-03-03

    在控制器里能定義使用什么中間件嗎?我沒有看到

hxg2050

差個$handler,我?guī)湍阊a(bǔ)充下

<?php

namespace app\common\middleware;

use Webman\Http\Request;
use Webman\Http\Response;
use Webman\MiddlewareInterface;

class ControllerMiddleware implements MiddlewareInterface
{

    /**
     * 實(shí)現(xiàn)控制器中間件處理
     * @param Request $request
     * @param callable $handler
     * @return Response
     */
    public function process(Request $request, callable $handler): Response
    {
        $controllerClass = $request->controller;

        try {
            $middlewareConfig = $controllerClass::middleware;
        } catch (\Throwable $e) {
            //沒有定義控制器中間件
            $middlewareConfig = [];
        }
        if ($middlewareConfig) {
            //如果存在中間件,則調(diào)用控制器中間件
            $count = count($middlewareConfig);
            $index = 0;
            $call = function (Request $request) use (&$call, $middlewareConfig, $handler, $count, &$index) {
                $middlewareClass = $middlewareConfig[$index];
                $index ++;
                $middleware = new $middlewareClass();
                return $middleware->process($request, $index == $count ? $handler : $call);
            };
            return $call($request);
        }

        return $handler($request);
    }
}
  • 暫無評論
年代過于久遠(yuǎn),無法發(fā)表評論

kyour

260
積分
0
獲贊數(shù)
0
粉絲數(shù)
2022-12-31 加入
??