遇到的場景
在一個商城網站中,對一個商品進行修改的操作有:編輯、上下架、稽核、設定是否熱門、設定是否促銷等。現在有個需求是:不允許修改狀態是已經失效的商品。
簡單粗暴的方法
一個最直接的方法是,在每個可能的操作前面新增相應的判斷,如果發現商品失效,就返回一個提示。這樣,你就必須修改每個可能的方法。
使用中介軟體
使用中介軟體來實現該需求是最好不過了,你不必修改其中的任何一個方法,只需要建立一個控制器中介軟體,新增業務邏輯,配置哪些操作需要中介軟體過濾,一切搞定。
實施步驟
-
建立一箇中介軟體
在專案跟目錄下,命令列執行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); }
-
配置控制器中介軟體
在需要用到該中介軟體的控制器所在的資料夾下,建立一個middleware.php
檔案,寫入如下程式碼:return [ app\http\middleware\Check::class ];
-
在需要中介軟體的控制器新增
middleware
屬性,程式碼示例如下:protected $middlewate = ['Check' => ['only' => ['actionA', 'actionB', 'actionC']]];
這樣一個控制器中介軟體就完成了。以後如果有某些方法需要加進去驗證,或者從驗證中去掉,只需要修改該屬性就可以了。