声明: この記事は Yao℃~ からエアドロップされたものであり、著者の許可なく複製することはできません。
このアイデアの背景には、実際的なニーズに遭遇したことがあった。そのとき、次のような要件に遭遇しました。
まず、多くのモジュールがあり、各モジュールには認証メソッドがあります。
当初はミドルウェアを使用してこれを実行したいと考えていましたが、各モジュールのフィルタリング方法が異なるため、ミドルウェアの数が突然大幅に増加することがわかりました。また、ミドルウェアがミドルウェアフォルダに分けられているため、ミドルウェアの再利用価値が実現できません。なので、ミドルウェアを使う方法はやめました。
このとき、各コントローラーが独自の独立した構造を持ち、各コントローラーが独自の認証方法を持っていればいいのではないかと思いました。
しかし、Laravel のコントローラーは自動コンストラクトを実装できますが、コンストラクト内の応答を実装することはできません。つまり、コンストラクト内の応答は無視されます。戻りエラー情報やリダイレクトを実装する必要はありません。
ドキュメントを調べても、完璧な解決策が見つからないようです。そこで、ソース コードを確認し、最終的にターゲットを beforeFilter に配置し、beforeFilter を使用してこの要件を達成しました。
該当するシナリオを並べ替えます。
この使用法は、同じフィルタリングのセットを必要とする各コントローラーに適しており、特定のフィルター方法はコントローラー自体によって決定されます。つまり、コントローラー自体のミドルウェア。
コードは次のとおりです。
まず、基本コントローラーを作成します。
<?phpnamespace App\Http\Controllers\Api\Business;use RuntimeException;use Illuminate\Routing\Controller as BaseController;use Illuminate\Auth\Guard;use Illuminate\Http\Request;abstract class Controller extends BaseController{ protected $request; protected $auth; public function __construct(Request $request,Guard $auth){ $this->request = $request; $this->auth = $auth; //统一鉴权 $this->beforeFilter(function(){ return $this->checkPermission(); }); } protected function checkPermission(){ throw new RuntimeException('['.get_class($this).'] missing method[checkPermission]'); }}
認証プロセス中の呼び出しを容易にするために、基本コントローラーにリクエストと認証を配置します。重要な点は、beforeFilter を設定し、beforeFilter を通じてコントローラー独自のプロトコル メソッドを呼び出すことです。基本コントローラーに checkPermission を設定する場合、このコントローラーに基づくすべてのコントローラーがこのメソッドをオーバーロードする必要があります。 beforeFilter は、middleware() と同様に 2 番目のパラメータを設定でき、例外またはのみを設定できます。
次に、このメソッドを継承するモジュール コントローラーを定義します。
<?phpnamespace App\Http\Controllers\Api\Business;class TicketController extends Controller{ //鉴定权限 protected function checkPermission(){ //return redirect()->to('某个url'); //return view(); //return 'string'; ... }}
checkPermission で応答が返される限り、ミドルウェアと同様にリクエスト全体の応答として使用されます。何も返されない場合、php は自動的に null を返します。 nullであればcheckPermissionの検証に合格したことを意味します。
このようにして、コントローラー自体に基づいたミドルウェアを実装でき、さらに多くの用途を発見する必要があります。
注: 現在これをバージョン 5.0 で使用していますが、それ以降のバージョンはまだテストされていません。
この記事は Yao℃~ によってエアドロップされました。質問がある場合は、彼と議論することもできます。彼は大学の 2 番目のグループにいます: 542175836。