記一次控制器中介軟體的使用

tsin發表於2019-08-20

遇到的場景

在一個商城網站中,對一個商品進行修改的操作有:編輯、上下架、稽核、設定是否熱門、設定是否促銷等。現在有個需求是:不允許修改狀態是已經失效的商品。

簡單粗暴的方法

一個最直接的方法是,在每個可能的操作前面新增相應的判斷,如果發現商品失效,就返回一個提示。這樣,你就必須修改每個可能的方法。

使用中介軟體

使用中介軟體來實現該需求是最好不過了,你不必修改其中的任何一個方法,只需要建立一個控制器中介軟體,新增業務邏輯,配置哪些操作需要中介軟體過濾,一切搞定。

實施步驟

  1. 建立一箇中介軟體
    在專案跟目錄下,命令列執行php think make:middleware Check,這將會在application目錄下,建立http/middleware資料夾(如果沒有的話),同時,生成一箇中介軟體檔案Check.php,其程式碼如下:

    <?php
    namespace app\http\middleware;
    
    class Check
    {
        public function handle($request, \Closure $next, $name)
        {
            return $next($request);
        }
    }

    接著,在中介軟體的handle方法新增具體的業務邏輯,大概是這樣子的:

    public function handle($request, \Closure $next, $name)
    {
        if ($id = $request->param('id')) {
            $result = \think\Db::name('goods')->where([['id', '=', $id], ['status', '=', 0]])->find();
            if ($result) {
                // 發現商品已經失效,返回一個提示資料,或者進行重定向等操作
               // 比如:
              // return \think\Response::create(['status' => 0, 'msg' => '該商品不能編輯哦'],'json');
          }
    }
        return $next($request);
    }
  2. 配置控制器中介軟體
    在需要用到該中介軟體的控制器所在的資料夾下,建立一個 middleware.php 檔案,寫入如下程式碼:

    return [
       app\http\middleware\Check::class
    ];
  3. 在需要中介軟體的控制器新增middleware屬性,程式碼示例如下:

    protected $middlewate = ['Check' => ['only' => ['actionA', 'actionB', 'actionC']]];

    這樣一個控制器中介軟體就完成了。以後如果有某些方法需要加進去驗證,或者從驗證中去掉,只需要修改該屬性就可以了。

Was mich nicht umbringt, macht mich stärker

相關文章