Permulaan penggunaan middleware dan penerangan langkah saya, saya harap ia dapat membantu Anda yang baru belajar php atau baru belajar kerangka berfikir berharap dapat berkomunikasi dengan anda dan membuat kemajuan.
Saya sudah memahami peranan middleware dalam rangka kerja Thinkphp Ia adalah pengepala yang dijana apabila pengguna mengakses sumber sebelum permintaan mencapai lapisan aplikasi atau input pos apabila pengguna meminta parameter atau jenis permintaan lain, dan operasi laluan url, termasuk pra atau pasca operasi atau perintah pelaksanaan dan penyelesaian lain. Selepas memahaminya, saya merasakan bahawa perkara ini sangat berguna dalam memproses data permintaan pengguna, yang jauh lebih baik daripada memprosesnya secara langsung dalam pengawal atau dalam tingkah laku. (Jadi saya membaca manual dokumentasi 5.1 dengan penuh teruja).
Selepas membaca dokumen, ikut kaedah manual rasmi dan taip kod berikut pada baris arahan:
php think make:middleware CheckMaksud kod ini adalah untuk menghasilkan direktori Middleware dan cipta fail middleware baharu bernama Semak
Kandungan dilengkapkan seperti biasa tanpa sebarang masalah
Kod dokumen 5.1 ditampal mengikut pelan keperluan dokumen
Disalin betul-betul mengikut manual, tanpa sebarang masalah Pastikan simpan dan pastikan tiada ralat.
Saya mengesahkan bahawa fail bernama middleware.php diletakkan dalam direktori root modul admin saya seperti yang ditunjukkan di bawah
, cuma buat seperti ini A pendaftaran, maka jika anda ingin menggunakan middleware di bawah modul ini, anda boleh menggunakannya.
Kemudian saya menambah kod yang ditunjukkan dalam gambar
,dalam pengawal mengikut kandungan dalam manual dokumentasi dan penerangan kandungan perisian tengah pengawal . Ternyata kod itu tidak dilaksanakan Saya menggaru kepala saya dalam kebingungan, jika saya melakukan ini, ia harus digunakan secara langsung. Dalam keadaan terdesak, mengikut pemahaman saya sendiri, saya menghentikan kod dalam middleware
Selepas melihat apa yang saya mahu lihat , uji saya $minta lagi. Saya melihat apa yang saya nantikan sejak sekian lama, middleware saya sudah sedia
Beritahu saya langkah di atas, langkah pertama telah selesai, saya kini boleh menggunakan perisian tengah untuk melakukan apa yang saya mahu lakukan
Langkah pertama ialah menukar nama kepada apa yang saya mahukan.
Selepas menyegarkan semula, saya dapati ia masih boleh digunakan dan ia berjalan sepenuhnya dengan lancar. Dalam langkah ini, saya juga mengukuhkan beberapa idea penggunaan saya, seperti mencipta berbilang middlewares Setiap pengawal harus mempunyai satu yang sepadan. Anda juga boleh menggunakannya selepas membaca manual kaedah lain, termasuk perubahan dalam susunan pelaksanaan, membuatkan saya tertanya-tanya. Mulai sekarang, kod itu boleh menjadi lebih tinggi sedikit lagi.
Langkah kedua ialah mewujudkan peraturan berfungsi dan bekerjasama dengan fail binaan sendiri dalam konfigurasi Config untuk mengawal akses
<?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; } }
Pada ketika ini, kerja pengesanan middleware yang mudah sudah tentu, kaedah penulisan ini tertakluk kepada keperluan tetap mengawal akses, antara muka Menyatukan api dan permintaan supaya ia boleh digunakan secara normal walau apa pun
Dua isu berasingan yang akan dinyatakan ialah anda sebenarnya boleh terus menggunakan kandungan yang perlu digunakan dalam konfigurasi
Masalah pertama ialah perisian tengah tidak mahakuasa, ia hanya boleh melakukan beberapa pemprosesan permintaan, dan ia mesti mengambil parameter Jangan sekali-kali melakukan pengesahan lanjutan yang tidak memenuhi keperluan lakukan beberapa pra-pengesahan. Jadikan data selamat atau jadikan data penuh
Masalah kedua ialah jangan cuba melakukan tindakan yang tidak sesuai dalam middleware, jangan laksanakan kod super kompleks dalam middleware, jika anda menggunakan middleware untuk melakukan kod super kompleks Atau operasi yang sangat panjang, saya menganggarkan bahawa ia boleh menipu ramai orang Apa yang saya nyatakan di sini termasuk menggunakan sesedikit mungkin kod fungsi yang ditakrifkan oleh perpustakaan fungsi anda sendiri untuk mengesahkan bahawa beberapa kod yang tidak dapat dielakkan masih boleh digunakan, seperti kata laluan. penyulitan dan kod serupa