본 글의 요청 주소는 구성된 도메인 이름입니다.
위에서 알 수 있습니다$instance
의 값은 appindexcontrollerIndex의 인스턴스
. $instance
的值就是appindexcontrollerIndex
的实例。
这块也是存在中间件的概念,依然如此中间件会在后文中单独提到,这里不做解释。
在这里$this->app['middleware']->controller
$this->app[' middleware ']->controller
이 코드를 사용할 때 ArrayAccess인지 __get인지 기억할 수 있나요? 여기에서는 객체에 액세스하기 위해 배열 액세스 형식을 사용하므로 두 개념을 명확하게 구분해야 합니다.
🎜🎜🎜그러면 메소드 이름을 얻을 수 있습니다. 메소드 이름을 얻는 방법은 이 클래스의 init 메소드에서 실행됩니다. 여기서는 반환된 값이 다음과 같다는 것만 알면 됩니다. 색인
. index
即可。
在这里需要注意的就是这行代码$this->rule->getConfig('action_suffix')
$ this->rule->getConfig('action_suffix')
, 여기서 얻은 것은 작업 메서드 접미사입니다.
이제 이 연산 방법 접미사에 값을 설정하면 어떤 모습일까요! 카카 값을 추가하고 액세스하여 결과가 어떻게 나올지 확인하세요. 🎜이때 접속하면 indexkaka 메소드가 명확하게 표시되지 않는다는 메시지가 표시됩니다. 이는 이 매개변수가 모든 메소드 이름에 카카를 추가한다는 의미입니다.
현재 작업 이름을 얻기 위한 코드 확장이 완료된 후 다음 단계는 if (is_callable([$instance, $action])) {
, 여기서 우리의 오랜 친구를 볼 수 있습니다is_callable
. if (is_callable([$instance, $action])) {
,在这里可以看见我们的老朋友is_callable
。
对于这里的is_callable俩个参数通过上文都知道是什么了,第一个参数为appindexcontrollerIndex
的实例,第二个参数为index
appindexcontrollerIndex
의 인스턴스, 두 번째 매개변수는 index
는 작업 메서드를 실행합니다. 🎜그러면is_callable
은 클래스에서 " 글꼴 크기: 14px; 오버플로 랩: 중단 단어; 테두리 반경: 4px; 배경 색상: rgba(27, 31, 35, 0.05); Operator Mono", Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(255, 93, 108);">index
메서드 이름을 실행할 수 있는지 여부입니다. is_callable
的作用就是检测在appindexcontrollerIndex
类中的index
方法名是否可以执行。
很明显这里会返回一个true,因为在index类里边存在index方法的。
这里在做测试之前一定要把刚刚在app的配置文件中配置的方法名后缀那个给取消掉。
通过这个is_callable
여기에서 테스트하기 전에 앱 구성 파일에서 방금 구성한 메서드 이름 접미사를 취소해야 합니다.
이를 통해 0.05); 글꼴 계열: "Operator Mono", Consolas, Monaco, Menlo, monospace; word-break: break-all;">is_callable 존재할지 여부를 판단합니다. 세 가지 상황, 카카가 이를 세 가지 측면에서 분석합니다. 🎜🎜🎜첫 번째 상황: 클래스에 실행 가능한 메서드가 있습니다🎜🎜$vars
는 빈 배열입니다. 매개변수가 포함된 이 코드 조각을 테스트하려면 라우팅 주소를 약간 변경해야 합니다.
이전에는 라우팅을 사용하지 않았지만 기본 주소를 직접 사용했습니다. 이 라우팅 주소는 다음
사용 이 라우팅 주소에 대한 데이터를 인쇄해 보면 우리가 설정한 라우팅 매개변수임을 알 수 있습니다.요청 변수를 얻는 이 방법은 $this->request->param();
이 코드 줄$this->request->param();
这行代码
框架是如何获取参数的
访问地址:http://www.source.com/index.php/hello/hello
在上文知道是通过$this->request->param()
来获取参数的,那么在框架是如何获取参数的呢!
根据流程代码会执行到下图,根据获取的请求方式来使用对应的方式来获取参数,在这里需要明确的是我们使用的是get请求。
所以代码会执行到$this->param
$this->request->param()
매개변수 가져오기 그렇다면 프레임워크에서 매개변수를 어떻게 얻나요? 🎜🎜프로세스 코드에 따르면 아래와 같이 실행됩니다. 획득한 요청 방법에 따라 매개변수를 얻으려면 해당 방법을 사용하십시오. 여기서 분명히 해야 할 것은 get 요청을 사용한다는 것입니다. 🎜🎜그래서 코드는 $this- > param
, 현재 요청 매개변수와 URL 주소의 매개변수가 여기에 병합됩니다. 🎜Kaka는 라우팅을 사용하여 요청을 하기 때문에 여기 프레임워크는 라우팅을 위한 요청 매개변수를 구체적으로 캡슐화합니다.
여기로 오세요route
메소드. 주석을 보면 라우팅 매개변수를 얻는 데 사용된다는 것을 알 수 있지만 여전히 입력 레이어에 들어가야 합니다. route
方法,看到注释就明白是用来获取路由参数的,但是还是需要在进入一层到input。
在之前路由的那一期文章中在获取到路由参数的时候会把参数合并到request的route属性。
所以说$this->route
$this-> ;route
는 라우팅 매개변수를 포함하여 이 라우팅 규칙의 모든 매개변수를 저장합니다. 🎜
이때 위의 $this->route
전달된 매개변수가 false이므로 이 블록이 직접 반환됩니다. $this->route
穿进来的参数是false,所以说这块会直接返回。
这里返回的结果会返回给上文我们开始解析的地方,也就是说这个$vars
🎜라우팅 매개변수 결과 반환🎜🎜🎜🎜두 번째 경우: 클래스에 실행 가능한 메서드가 없습니다🎜🎜
첫 번째 판단이 실행될 때is_callable 클래스의 메소드가 실행 가능하지 않다고 판단되면 두 번째 상황이 실행됩니다. <code style="font-size: 14px; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; background-color: rgba(27, 31, 35, 0.05); font-family: " operator mono consolas monaco menlo monospace word-break: break-all color: rgb>is_callable
判断类里边的方法不可执行时,就会执行到第二种情况。
先来请求的一个没有设置的路由地址,看会返回什么。
根据代码给的提示,我们来到index控制器建立一个_empty
_empty
메소드를 다시 요청하고 무슨 일이 일어나는지 확인하세요. 🎜🎜🎜🎜인쇄 결과를 보면 액세스한 메소드가 존재하지 않으면 이 메소드가 실행되는 것을 볼 수 있습니다_empty
.
이 메소드는 어떻게 실행되나요? 이 실행 방법은 반사 메커니즘을 사용하여 달성됩니다. 이전에 반사 Kaka를 설명하는 특별 문서가 있지만 여전히 문서를 읽고 봐야 합니다.
세 번째 경우: 클래스에 실행 가능한 메서드나 _empty 메서드가 없습니다
이 경우는 비교적 간단하며, 오류 메시지를 직접 반환할 뿐입니다. 여기서 예외 처리에 대해서도 나중에 설명하겠습니다.
세 가지 상황 실행 후
세 가지 상황 분석을 거쳐 최종적으로 통계적 방법이 구현됩니다.
반사 실행 클래스를 호출하는 방법은 매개변수 바인딩을 지원합니다. 이는 여기서 클로저 실행 프로세스가 여기서 완료된다는 의미입니다.
다음 자동 요청은 섹션 5에 자세히 설명되어 있습니다.
이전 섹션에서는 3~4주기에 대한 라우팅을 설명했고, 마지막 설명은 여기까지입니다. 그렇다면 설정된 라우팅을 실행하는 방법!
다음에는 이 경로를 케이스로 사용하세요
경로 감지를 시작할 때 반환 값이 무엇인지 아직도 기억하시나요? 아래 사진을 봐주세요
당시에는 아래 코드에 대한 자세한 설명이 없었습니다. 제가 원하는 것은 바로 인스턴스화 컨트롤러였습니다. 지금 말하는 것은 현재 일정 정보 기록
이 코드 줄. 记录当前调度信息
这行代码。
在这里$this->request
$this->request code > 존재하지 않는 속성에 접근할 때 컨테이너 클래스의 매직 메소드를 실행하고, 최종적으로 컨테이너를 통해 인스턴스를 반환하는 데 사용됩니다. 🎜그래서 아래 그림의 위치에 코드가 실행되어 현재 요청의 일정 정보를 설정하거나 가져옵니다
여기에서 찾을 수 있습니다. 여기에서 컨트롤러 인스턴스화에 인쇄합니다. 반환된 값은 index
입니다. 다음으로 컨트롤러로 이동하여 확인하세요.
라우팅 주소를 사용하여 결과를 인쇄하려면 init 메소드로 오세요
여기 값이 왜 바뀌었는지 아시나요?
위에 인쇄된 값은 아래 사진인데 왜 여기 위 사진인가요!
라우팅 섹션의 마지막 단계는 라우팅 스케줄링을 시작하고 마지막으로 모듈/컨트롤러/작동 방법에 대한 라우팅을 호출하는 것입니다.
이 방법은dispatchModule
마지막으로 클래스를 인스턴스화합니다. 다음으로 이 클래스를 심층적으로 연구해야 합니다
코드 추적에 따르면 실제로는 thinkroutedispatchModule
이 클래스thinkroutedispatchModule
这个类
来到Module
这个类,又会发现继承着Dispatch
类
在thinkphp/library/think/route/Dispatch.php
这个类的控制器中,会发现对dispatch
🎜🎜 클래스 별칭 🎜🎜🎜 제공Module
클래스에서는 디스패치
클래스🎜🎜🎜🎜thinkphp/library/think/route/Dispatch.php
이 클래스의 컨트롤러에서 dispatch
이 변수가 설정됩니다. 🎜
이제 路由到模块/控制器/操作
여기서 메소드에 전달된 매개변수는 무엇인지 다시 살펴보겠습니다. ㅎㅎ
그래서 결국 값은 별도의 배열 형태로 출력됩니다.
그런 다음 다음 작업은 라우팅 액세스를 사용하지 않는 프로세스와 동일하므로 구문 분석할 필요가 없습니다.
이것이 컨트롤러에서 라우팅 주소를 인스턴스화하는 방법의 끝입니다.
기부$this->app->controller
传入的是index
,返回的是整个类名,具体的实现过程就不去解析了,实现的方法是$this->parseModuleAndClass
에 관해 직접 조사해 볼 수 있습니다!
3. autoResponse 스케줄링 실행
4번째 섹션에서는 실행 컨트롤러의 메소드가 아래 그림의 위치에서 반환된다는 것만 언급할 뿐, 반환 방법은 자세히 설명하지 않습니다.
다음으로 실행 방법에 대해 잠시 설명하는 시간을 갖도록 하겠습니다.
접속 라우팅 주소는 아래와 같이 반환된 데이터가 컨트롤러에서 반환해야 하는 데이터임을 알 수 있습니다.
인쇄된 값은 아래 그림과 같습니다. 여기서는 명확해야 합니다. 소스 코드를 읽으려면 약간의 탐색이 필요하며 시간이 지나면 내용을 이해하게 됩니다.
다음으로 $this->autoResponse($data);
이 방법에 대한 심층 분석을 수행합니다. 이 방법은 말 그대로 자동 응답을 의미합니다.
이 실행 과정의 첫 번째 줄$data instanceof Response
에서 이 내용을 이해하지 못하면 읽을 수 없습니다.
당신이 모르고 이해하지 못하는 것은 여전히 해결되어야 합니다. 소스 코드를 읽고 조금씩 정복하면 승리할 수 있습니다.
instanceof 사용 정보
Instanceof는 객체가 특정 클래스의 인스턴스인지, 객체가 특정 인터페이스를 구현하는지 여부를 확인할 수 있습니다.
다음으로 Kaka는 이를 설명하기 위해 간단한 예를 제공하고 무슨 일이 일어나고 있는지 이해하게 될 것입니다.
케이스 1
먼저 두 개의 클래스를 생성합니다. 케이스는 아래와 같습니다.
아래 그림은 인쇄 결과인데 첫 번째는 true를 반환하고 두 번째는 false를 반환하는 것을 볼 수 있습니다.
는 객체가 특정 클래스의 인스턴스, 즉 $instance
就是类Test
의 인스턴스인지 확인하여 true를 반환합니다.
케이스 2
케이스 2는 인터페이스가 설정되고 클래스가 인터페이스를 구현합니다.
최종 반환 결과는 모두 true입니다. 즉, 클래스가 다른 인터페이스를 구현하면 판단 시 true가 된다는 의미입니다.
위는 instanceof
는 두 가지 데모 사례를 제공하며 이를 이해하는 것은 인스턴스가 특정 클래스의 인스턴스인지 확인하는 것입니다. instanceof
给出的俩种演示案例,对其理解就是判断一个实例是否为某个类的实例。
那么就在回到正文,$data instanceof Response
这行代码肯定不会成立,因为data传过来的就是控制器返回的值。
所以说代码执行流程会执行到下图位置,使用了is_null
그런 다음 $data 인스턴스 응답
이 코드 줄은 전달된 데이터가 컨트롤러에서 반환된 값이기 때문에 확실히 설정되지 않습니다. 그래서 코드 실행 프로세스는 is_null
함수는 판단을 내립니다. 판단은 거짓이어야 하므로 다음 코드가 실행됩니다. 🎜🎜이 코드의 처음 두 지점은 분석되지 않습니다. 🎜첫 번째는 기본적으로 응답 출력 유형을 자동으로 식별하는 것입니다. 이는 Ajax 요청인지 여부를 확인하는 것입니다. 이번에는 KaKa가 프레임워크 소스 코드를 구문 분석할 때까지 기다린 후 매일 시간이 걸립니다. 프레임워크의 몇 가지 방법을 검토합니다.
두 번째 위치는 구성 파일에서 해당 구성 정보를 얻는 것입니다. 실행되는 규칙 클래스의 메소드를 살펴보는데, 메소드에는 구성 정보를 얻기 위해 실행되는 코드가 있습니다.
그런 다음 위에서 언급하지 않은 세 번째 부분인 코드 $response = Response::create($data, $type);
$response = Response::create($data, $type);
来到类thinkphp/library/think/Response.php
的方法create
中,这个方法就是用来创建Response对象。
这里只需要去关注一下咔咔圈出来的地方即可,在thinkphp/library/think/response
클래스로 오세요thinkphp/library/think/Response.php 메소드create
, 이 메소드는 응답 객체. 🎜🎜thinkphp/library/think/response
이 디렉토리에는 HTML이 없습니다. 🎜그래서 코드는 이 클래스를 직접 인스턴스화한 다음 반환합니다.
이 클래스의 생성자에 오면 주로 몇 가지 작업을 수행합니다.
이 클래스의 데이터 속성에 반환 값 할당
페이지 출력 유형 설정
반환 상태 코드
앱 인스턴스 개체 설정
헤더 정보
그런 다음 코드는 반환 값을 autoResponse
这个方法的$response
이 변수에 할당합니다.
마지막으로 다음 $response
give 아래와 같이 결과를 반환하고 인쇄합니다. $response
给返回出去,并且返回信息如下图打印结果。
然后代码依然会向上层返回,回到最初的闭包函数。
在咔咔圈出来的地方,下一行代码也是关于中间件,只需要知道最终返回结果跟上图打印的结果一样即可。
最终返回结果回到thinkphp/library/think/route/Dispatch.php
여기에 이미지 설명을 삽입하세요
🎜그런 다음 코드는 여전히 상위 레이어로 돌아가 원래의 클로저 기능으로 돌아갑니다. 🎜🎜Kaka가 동그라미 친 부분의 다음 코드도 미들웨어에 관한 것입니다. 최종 반환 결과가 그림에 인쇄된 결과와 동일하다는 점만 알아두시면 됩니다. 🎜🎜🎜중간 수준으로 돌아가기 🎜최종 결과는 thinkphp/library/think/route/Dispatch.php
, 여기서부터 분석을 시작했습니다. 🎜🎜🎜🎜결과를 $data
를 입력하고 return $this->autoResponse($data);
$data
,然后在进行执行return $this->autoResponse($data);
你没看错,这里的代码熟悉吧!
这个时候返回的结果就是Response
的实例,所以会直接返回$response
읽으셨군요. 여기 코드는 익숙합니다! 이번에 반환된 결과는 응답 code > 인스턴스이므로 <code style="font-size: 14px; Overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; background-color: rgba( 27 , 31, 35, 0.05); 글꼴 계열: " operator mono consolas monaco menlo monospace word-break: break-all rgb>$response.
자동 응답
🎜🎜여기까지는 컨트롤러의 메서드가 실행되고 응답이 구문 분석됩니다. 🎜설정된 라우팅 규칙이든, 모듈 컨트롤러 방식을 사용한 직접 액세스든, 응답 결과는 결국 위의 방법을 통해 반환됩니다.
“배움에 대한 끈기, 블로그에 대한 끈기, 공유에 대한 끈기는 카카가 경력 이후부터 늘 지켜온 신념입니다. 거대한 인터넷에 올라온 카카의 글이 여러분에게 조금이나마 도움이 되기를 바랍니다. 카카 다음호에서 만나요
”
위 내용은 ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!