コントローラーでの ThinkPHP5.1 ミドルウェアの使用プロセス
ミドルウェアの使用の開始と手順の説明。次のような方の参考になれば幸いです。 PHP を学んだばかりの人、または思考フレームワークを学んだばかりの人は、あなたとコミュニケーションをとって進歩することを望んでいます。
Thinkphp フレームワークにおけるミドルウェアの役割はすでに理解しています。これは、ユーザーがリソースにアクセスするときに生成されるヘッダー、またはリクエストがアプリケーション層に到達する前にユーザーがパラメーターをリクエストするときに生成される入力です。または getまたはその他のリクエスト タイプ、および URL パス操作 (操作前または操作後、実行順序、その他のソリューションを含む)。それを理解した後、これはユーザーのリクエストデータを処理するのに非常に役立ち、コントローラーやビヘイビアで直接処理するよりもはるかに優れていると感じます。 (それで、私は 5.1 のドキュメント マニュアルを興奮しながら読みました)。
ドキュメントを読んだ後、公式マニュアルの方法に従い、コマンド ラインに次のコードを入力します。
php think make:middleware Check
このコードの意味は、ミドルウェア ディレクトリを作成し、 Check という名前の新しいミドルウェア ファイルを作成します。
内容は問題なく正常に完了します。
ドキュメント要件に従って 5.1 ドキュメント コードが貼り付けられます。
#マニュアルに従って正確にコピーし、問題はありません。保存とエラーを確認してください。 この A 登録と同じように、以下に示すように、middleware.php という名前のファイルが管理モジュールのルート ディレクトリに配置されていることを確認します。このモジュールでミドルウェアを使用したい場合は、それを使用できます。 次に、ドキュメント マニュアルの内容とコントローラー ミドルウェアの内容の説明
#,
## に従って、コントローラーに図に示すコードを追加しました。 # コードが実行されていないことが判明しました。混乱して頭をかきむしりました。理解によれば、これを実行した場合、直接適用されるはずです。結果オブジェクトは空でした。私自身の理解によれば、絶望的になり、ミドルウェアのコードを停止しました。見たいものを確認した後、テストしてみました。 $request をもう一度。長い間楽しみにしていたものを確認しました。ミドルウェアの準備が整いました。
上記これまでの手順を教えてください。最初のステップは完了しました。ミドルウェアを使用してやりたいことを実行できるようになりました。
最初のステップは、名前を希望する名前に変更することです。ここには 3 つの変更があります。 。
もう一度更新した後、まだ使用できることがわかり、完全に実行されました。スムーズに。このステップでは、ミドルウェアを複数作成するなど、使い方のアイデアも固めました。各コントローラーに対応するミドルウェアが必要です。ここで独自の処理を行うこともできます。マニュアルを読んでから使用することもできます。その他、さまざまな実行順序の変更を含むメソッドには疑問を感じます。今後、コードは再び少し高くなる可能性があります。
2 番目のステップは、Config 構成内の自己構築ファイルと連携してアクセスを制御するための機能ルールを確立することです。
##
<?php namespace apphttpmiddleware; use thinkfacadeConfig; use thinkfacadeRequest; /** 登陆接口通用数据配置检测*/ class AdminLoginCheck { /** * handle 重写处理请求对象的操作函数 * @param object Request $request 请求对象 * @param object \Closure $next 响应对象 * @return array 错误返回的信息 * code 返回码 * msg 返回信息 * data 返回数据 * @return object 响应对象 */ public function handle($request, \Closure $next) { // 检测配置,查看该接口服务是否被暂停使用 if (true !== Config::get(Request::module().'.'.Request::action().'.'.Request::action().'_api')) // 如果结果不符合要求则返回错误信息 exit(json_encode(['code'=>1,'msg'=>'Interface_Pause_service','data'=>''])); // 检测配置,是否执行请求验证类型 if (false !== Config::get(Request::module().'.'.Request::action().'.'.Request::action().'_request')) { // 登陆请求规则,传入相应方法,查看该接口是否符合请求类需 $res = self::loginRequestRole(Request::action()); // 如果结果不符合要求则返回错误信息 if (true !== $res) exit(json_encode(['code'=>1,'msg'=>'Request_Type_Not_Matching','data'=>''])); } // 检测配置,是否执行地址限制验证 if (false !== Config::get(Request::module().'.'.Request::action().'.'.Request::action().'_address')) { // 客户端访问地址限制请求规则 $res = self::loginAddressDispose(Request::ip()); // 如果结果不符合要求则返回错误信息 if (true !== $res) exit(json_encode(['code'=>1,'msg'=>'Address_Not_Access','data'=>''])); } // 格式化与处理前台参数 $request = self::loginParamDispose(Request::action(),$request); // 继续执行进入到控制器 return $next($request); } /** * loginRequestRole 请求类型验证 * @param string $scene 根据路径传入方法名称 * @return bool 验证用户访问的接口是否符合预设的请求要求 */ protected static function loginRequestRole($scene) { switch ($scene) { // 登陆页面请求验证 case 'index': if (Request::isGet()) return true; else return false; break; // 登陆接口请求验证 case 'login': if (Request::isPost() || Request::isAjax() || Request::isPjax()) return true; else return false; break; // 登陆接口请求验证 case 'resetPassword': if (Request::isPost() || Request::isAjax() || Request::isPjax()) return true; else return false; break; // 默认验证或者不存在的场景返回 default: return false; break; } } /** * loginAddressDispose 地址是否允许访问 * @param string $address 需要传入一个address地址 * @return string 返回错误信息 * @return bool 检测正确返回真 */ protected static function loginAddressDispose($address) { // 读取配置内的设置参数 $data = Config::get(Request::module().'.'.Request::action().'.'.Request::action().'_address_data'); // 如果配置信息address列表为空则返回不能访问 if (empty($data)) return false; // 循环地址列表信息解开连续address地址列表 foreach ($data as $key => $val) { if ($val == $address) return true; } // 如果继续执行下去依然没有 返回不能访问 return false; } /** * loginParamDispose post内容与格式处理 * @param string $scene 需要前往的接口名称 * @param object $request 请求的对象内容 * @return object 返回处理过的请求对象 */ protected static function loginParamDispose($scene,$request) { switch ($scene) { // 登陆页面 case 'index': break; // 登陆接口请求参数处理 case 'login': // 前台用户传入的参数进行调整转换 $request->username = $request->param('user'); $request->password = $request->param('pass'); $request->captcha = $request->param('code'); // 对记住我进行处理 $remember = $request->param('remember'); if (null === $remember) $request->remember = 'shut'; else $request->remember = 'open'; break; // 重置密码接口参数处理 case 'resetPassword': // 前台用户传入的参数进行调整转换 $request->username = $request->param('user'); $request->phone = $request->param('mobile'); $request->phonecode = $request->param('code'); $request->password = $request->param('pass'); $request->repassword = $request->param('repass'); break; // 默认接口或者不存在的场景返回 default: break; } return $request; } }