>PHP 프레임워크 >ThinkPHP >컨트롤러에서 TP5.1 미들웨어는 어떻게 사용되나요? (과정에 대한 자세한 설명)

컨트롤러에서 TP5.1 미들웨어는 어떻게 사용되나요? (과정에 대한 자세한 설명)

藏色散人
藏色散人앞으로
2022-01-13 11:09:102656검색

다음thinkphp 프레임워크튜토리얼 칼럼에서는 ThinkPHP5.1 미들웨어를 컨트롤러에서 사용하는 과정을 소개하겠습니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!

컨트롤러에서 ThinkPHP5.1 미들웨어를 사용하는 과정

미들웨어 사용의 시작과 단계별 설명이 막 PHP를 배우거나 Think Framework를 배우는 분들께 도움이 되었으면 좋겠습니다. 나는 당신과 소통하고 나 자신을 발전시킬 수 있습니다.

요청이 애플리케이션 계층에 도달하기 전에 사용자가 리소스에 액세스하면 생성된 헤더 또는 사용자의 요청 매개변수가 post 또는 get 또는 기타 요청에 입력되는 방식으로 Thinkphp 프레임워크에서 미들웨어의 역할을 이미 이해하고 있습니다. 사전 또는 사후 작업이나 실행 순서 및 기타 솔루션을 포함하여 작동할 URL 경로입니다. 이해한 후에는 이 기능이 사용자 요청 데이터를 처리하는 데 매우 유용하다는 것을 느꼈습니다. 컨트롤러나 동작에서 직접 처리하는 것보다 훨씬 낫습니다. (그래서 5.1 문서 매뉴얼을 신나게 읽었습니다.)

문서를 읽은 후 공식 매뉴얼 방법에 따라 명령줄에 다음 코드를 입력하세요.
php think make:middleware Check
미들웨어 디렉터리를 생성하고 생성한다는 이 코드의 의미에는 문제가 없습니다. a new 이름은 Check middleware file 입니다
내용은 문제없이 정상적으로 완료되었습니다

5.1 문서코드는 문서요구계획대로 붙여넣었습니다

컨트롤러에서 TP5.1 미들웨어는 어떻게 사용되나요? (과정에 대한 자세한 설명)

설명서대로 완벽하게 복사되어 문제없습니다. . 저장되었는지, 오류가 없는지 확인하세요.

아래 그림과 같이 middleware.php라는 파일이 내 관리 모듈의 루트 디렉터리에 있음을 확인합니다

컨트롤러에서 TP5.1 미들웨어는 어떻게 사용되나요? (과정에 대한 자세한 설명)

이 모듈에서 미들웨어를 사용하려면 등록하세요. 이제 사용할 준비가 되었습니다.

그런 다음 설명서 매뉴얼의 내용과 컨트롤러 미들웨어의 내용 설명에 따라 컨트롤러에 그림과 같이 코드를 추가했는데

컨트롤러에서 TP5.1 미들웨어는 어떻게 사용되나요? (과정에 대한 자세한 설명),

코드가 실행되지 않은 것으로 나타났습니다. 혼란스러워요. 내 이해에 따르면 이렇게 하면 직접 적용할 수 있어야 하는데 결과 개체가 비어 있습니다. 필사적으로 내 이해에 따라 미들웨어에서 코드를 중지했습니다

컨트롤러에서 TP5.1 미들웨어는 어떻게 사용되나요? (과정에 대한 자세한 설명)

보고 싶은 것을 본 후 $request를 다시 테스트했습니다. 오랫동안 기다려온 것을 보니 미들웨어가 준비되었습니다

컨트롤러에서 TP5.1 미들웨어는 어떻게 사용되나요? (과정에 대한 자세한 설명)

이제 위의 단계를 통해 첫 번째 단계가 완료되었으며 이제 미들웨어를 사용할 수 있습니다. do what I want to do

첫 번째 단계는 이름을 내가 원하는 대로 변경하는 것입니다. 여기에는 세 가지 변경 사항이 있습니다.
컨트롤러에서 TP5.1 미들웨어는 어떻게 사용되나요? (과정에 대한 자세한 설명)
컨트롤러에서 TP5.1 미들웨어는 어떻게 사용되나요? (과정에 대한 자세한 설명)

컨트롤러에서 TP5.1 미들웨어는 어떻게 사용되나요? (과정에 대한 자세한 설명)

다시 새로고침한 후에도 여전히 사용할 수 있고 매우 원활하게 실행되는 것을 확인했습니다. 이 단계에서는 여러 개의 미들웨어를 만드는 등의 몇 가지 사용 아이디어도 확정했습니다. 각 컨트롤러에는 해당하는 것이 있어야 합니다. 여기서는 매뉴얼을 읽은 후에 일부 처리를 수행할 수도 있습니다. 실행 순서 변경을 포함한 다른 방법이 궁금합니다. 이제부터는 코드가 다시 조금 더 커질 수 있습니다.

두 번째 단계는 기능 규칙을 설정하고 Config 구성에서 자체 구축된 파일과 협력하여 액세스를 제어하는 ​​것입니다

컨트롤러에서 TP5.1 미들웨어는 어떻게 사용되나요? (과정에 대한 자세한 설명)

컨트롤러에서 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로 통합되어야 하며 요청도 통합되어야 합니다. 요청하면 뭐든 정상적으로 사용할 수 있습니다

제가 별도로 이야기하고 싶은 두 가지 문제는 구성에서 사용해야 하는 콘텐츠를 실제로 계속 사용할 수 있다는 것입니다

첫 번째 문제는 미들웨어가 그렇지 않다는 것입니다. 전능하고 일부 요청 처리만 수행할 수 있으며, 매개변수를 가져와야 합니다. 요구 사항을 충족하지 않는 고급 검증을 수행하지 마십시오. 여기서 가장 중요한 것은 데이터를 안전하게 또는 완전하게 만들기 위해 몇 가지 사전 검증을 수행하는 것입니다. 문제는 미들웨어에서 부적절한 일을 하려고 하는 것이 아닙니다. 미들웨어에서 매우 복잡한 코드를 실행하지 마십시오. 미들웨어를 사용하여 매우 복잡한 코드나 긴 작업을 수행하면 많은 사람을 속일 수 있을 것으로 예상됩니다. 여기에는 자신의 함수 라이브러리에 정의된 기능을 가능한 한 적게 사용하는 것이 포함됩니다. 비밀번호 암호화 및 유사한 코드와 같은 일부 불가피한 기능 코드 확인은 여전히 ​​사용될 수 있습니다

추천 학습: "
최신 10개의 thinkphp 비디오 튜토리얼

"

위 내용은 컨트롤러에서 TP5.1 미들웨어는 어떻게 사용되나요? (과정에 대한 자세한 설명)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제