ホームページ  >  記事  >  PHPフレームワーク  >  TP5.1ミドルウェアはコントローラ内でどのように使用されていますか? (詳しい工程説明)

TP5.1ミドルウェアはコントローラ内でどのように使用されていますか? (詳しい工程説明)

藏色散人
藏色散人転載
2022-01-13 11:09:102634ブラウズ

次のthinkphp フレームワークチュートリアル コラムでは、コントローラーで ThinkPHP5.1 ミドルウェアを使用するプロセスを紹介します。

コントローラーでの ThinkPHP5.1 ミドルウェアの使用プロセス

ミドルウェアの使用の開始と手順の説明。次のような方の参考になれば幸いです。 PHP を学んだばかりの人、または思考フレームワークを学んだばかりの人は、あなたとコミュニケーションをとって進歩することを望んでいます。

Thinkphp フレームワークにおけるミドルウェアの役割はすでに理解しています。これは、ユーザーがリソースにアクセスするときに生成されるヘッダー、またはリクエストがアプリケーション層に到達する前にユーザーがパラメーターをリクエストするときに生成される入力です。または getまたはその他のリクエスト タイプ、および URL パス操作 (操作前または操作後、実行順序、その他のソリューションを含む)。それを理解した後、これはユーザーのリクエストデータを処理するのに非常に役立ち、コントローラーやビヘイビアで直接処理するよりもはるかに優れていると感じます。 (それで、私は 5.1 のドキュメント マニュアルを興奮しながら読みました)。

ドキュメントを読んだ後、公式マニュアルの方法に従い、コマンド ラインに次のコードを入力します。
php think make:middleware Check
このコードの意味は、ミドルウェア ディレクトリを作成し、 Check という名前の新しいミドルウェア ファイルを作成します。
内容は問題なく正常に完了します。

ドキュメント要件に従って 5.1 ドキュメント コードが貼り付けられます。

TP5.1ミドルウェアはコントローラ内でどのように使用されていますか? (詳しい工程説明)

#マニュアルに従って正確にコピーし、問題はありません。保存とエラーを確認してください。

この A 登録と同じように、以下に示すように、middleware.php という名前のファイルが管理モジュールのルート ディレクトリに配置されていることを確認します。このモジュールでミドルウェアを使用したい場合は、それを使用できます。

次に、ドキュメント マニュアルの内容とコントローラー ミドルウェアの内容の説明

TP5.1ミドルウェアはコントローラ内でどのように使用されていますか? (詳しい工程説明)#,

## に従って、コントローラーに図に示すコードを追加しました。 # コードが実行されていないことが判明しました。混乱して頭をかきむしりました。理解によれば、これを実行した場合、直接適用されるはずです。結果オブジェクトは空でした。私自身の理解によれば、絶望的になり、ミドルウェアのコードを停止しました。

TP5.1ミドルウェアはコントローラ内でどのように使用されていますか? (詳しい工程説明)

見たいものを確認した後、テストしてみました。 $request をもう一度。長い間楽しみにしていたものを確認しました。ミドルウェアの準備が整いました。

TP5.1ミドルウェアはコントローラ内でどのように使用されていますか? (詳しい工程説明)

上記これまでの手順を教えてください。最初のステップは完了しました。ミドルウェアを使用してやりたいことを実行できるようになりました。

最初のステップは、名前を希望する名前に変更することです。ここには 3 つの変更があります。 。 TP5.1ミドルウェアはコントローラ内でどのように使用されていますか? (詳しい工程説明)


TP5.1ミドルウェアはコントローラ内でどのように使用されていますか? (詳しい工程説明)もう一度更新した後、まだ使用できることがわかり、完全に実行されました。スムーズに。このステップでは、ミドルウェアを複数作成するなど、使い方のアイデアも固めました。各コントローラーに対応するミドルウェアが必要です。ここで独自の処理を行うこともできます。マニュアルを読んでから使用することもできます。その他、さまざまな実行順序の変更を含むメソッドには疑問を感じます。今後、コードは再び少し高くなる可能性があります。
2 番目のステップは、Config 構成内の自己構築ファイルと連携してアクセスを制御するための機能ルールを確立することです。TP5.1ミドルウェアはコントローラ内でどのように使用されていますか? (詳しい工程説明)

TP5.1ミドルウェアはコントローラ内でどのように使用されていますか? (詳しい工程説明)

##

TP5.1ミドルウェアはコントローラ内でどのように使用されていますか? (詳しい工程説明)

<?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().&#39;.&#39;.Request::action().&#39;.&#39;.Request::action().&#39;_api&#39;))
    // 如果结果不符合要求则返回错误信息
    exit(json_encode([&#39;code&#39;=>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;
}
}

ここまでで簡単なミドルウェアの検出作業は完了ですが、もちろんこの書き方にはインターフェースの統一などの一定の要件があります。複数の制御アクセス。何があっても正常に使用できるように、API リクエストをリクエストに含めます。

言及すべき 2 つの別個の問題は、使用する必要があるコンテンツを実際に引き続き使用できることです。

# 最初の問題は、ミドルウェアが万能ではないということです。ミドルウェアは一部のリクエスト処理しか実行できず、パラメーターを取得する必要があります。要件を満たさない高度な検証は決して行わないでください。ここで最も重要なことは、データを安全にする、またはデータがいっぱいになるように事前検証を行うためです。

2 番目の問題は、ミドルウェアで不適切なアクションを実行しようとしないことです。ミドルウェアで非常に複雑なコードを実行しないでください。ミドルウェアを使用して超複雑なコードを実行するか、長時間の操作で多くの人々が死亡する可能性があると推定しています。ここで述べたことには、独自の関数ライブラリで定義された関数コードの使用を最小限に抑えて、避けられないコードが引き続き使用できることを確認することが含まれます。パスワード暗号化や同様のコードなど

推奨学習: 「

最新の 10 の thinkphp ビデオ チュートリアル

以上がTP5.1ミドルウェアはコントローラ内でどのように使用されていますか? (詳しい工程説明)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。