본 글의 요청 주소는 구성된 도메인 이름입니다.
위에서 알 수 있습니다$instance
의 값은 appindexcontrollerIndex 코드> 인스턴스. <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,.05); font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">$instance
的值就是appindexcontrollerIndex
的实例。
这块也是存在中间件的概念,依然如此中间件会在后文中单独提到,这里不做解释。
在这里$this->app['middleware']->controller
这段代码的使用,还能记得是使用的ArrayAccess还是直接为__get吗?
这里是在使用访问数组的形式访问对象,所以使用的是ArrayAccess的形式,这俩种概念一定要区分清楚。
接下来就会执行获取方法名,至于这个方法名怎么获取的是在本类的init方法执行的,这里只需要知道返回的是index
$this->app['middleware' ]->controller
이 코드를 사용할 때 ArrayAccess인지 __get인지 기억할 수 있나요? 🎜🎜여기에서는 객체에 액세스하기 위해 배열 액세스 형식을 사용하므로 두 개념을 명확하게 구분해야 합니다. 🎜🎜🎜reflection을 통해 컨트롤러 메소드를 실행🎜🎜🎜그러면 메소드 이름을 얻을 수 있습니다. 메소드 이름을 얻는 방법은 이 클래스에 있습니다. init 메소드가 실행되면 반환되는 내용이 색인
그게 다입니다. 🎜여기서 주목해야 할 것은 다음 코드 줄입니다.$this->rule->getConfig('action_suffix')
,这里获取的是ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?。
假如现在给这个ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?设置一个值会变成什么样子呢!
给添加一个kaka的值,进行访问一下看会是什么结果。
这个时候进行访问会提示indexkaka的这个方法不存在,是不是清晰可见了,说明这个参数是在为所有的方法名追加一个kaka。
对获取当前操作名的代码进行扩展完成之后,紧接着就是if (is_callable([$instance, $action])) {
,在这里可以看见我们的老朋友is_callable
。
对于这里的is_callable俩个参数通过上文都知道是什么了,第一个参数为appindexcontrollerIndex
的实例,第二个参数为index
if (is_callable([$instance, $action])) {
우리의 오랜 친구를 참조하세요is_callable
🎜🎜위에서 is_callable의 두 매개변수가 무엇인지 알 수 있습니다. 첫 번째 매개변수는 appindexcontrollerIndex
의 인스턴스, 두 번째 매개변수는 index
작업 방법을 실행합니다. 🎜그런 다음 is_callable
은 -크기: 14px; 단어 줄바꿈: 중단 단어; 패딩: 2px 4px; 여백: 0 2px; 글꼴 계열: 연산자 Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">index
메서드 이름을 실행할 수 있는지 여부입니다. is_callable
的作用就是检测在appindexcontrollerIndex
类中的index
方法名是否可以执行。
很明显这里会返回一个true,因为在index类里边存在index方法的。
这里在做测试之前一定要把刚刚在app的配置文件中配置的方法名后缀那个给取消掉。
通过这个is_callable
判断会存在三种情况,接下来咔咔将会从三个方面给大家进行解析。
第一种情况:类里边存在可执行的方法
$vars
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
方法,看到注释就明白是用来ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?的,但是还是需要在进入一层到input。
在之前路由的那一期文章中在获取到路由参数的时候会把参数合并到request的route属性。
所以说$this->route
就是存放的这条路由规则所有的参数,包含路由参数。
这时执行流程会执行到获取变量 支持过滤和默认值,在上文中$this->route
$this->route
는 라우팅 매개변수를 포함하여 이 라우팅 규칙의 모든 매개변수가 저장되는 곳입니다. 🎜🎜🎜결과 인쇄🎜🎜🎜이때 필터링 및 기본값을 지원하는 변수를 얻기 위한 실행 프로세스가 실행됩니다. 위의 $this->route
전달된 매개변수가 false이므로 이 블록은 직접 반환됩니다. 🎜여기에 반환된 결과는 위에서 구문 분석을 시작한 위치, 즉 $vars
는 얻은 라우팅 매개변수입니다. $vars
就是获取到的路由参数。
第二种情况:类里边不存在可执行的方法
当第一种判断执行is_callable
判断类里边的方法不可执行时,就会执行到第二种情况。
先来请求的一个没有设置的路由地址,看会返回什么。
根据代码给的提示,我们来到index控制器建立一个_empty
is_callable
클래스 내의 메소드가 실행 가능하지 않다고 판단되면 두 번째 상황이 실행됩니다. 🎜🎜🎜두 번째 실행 사례🎜🎜🎜먼저 설정되지 않은 라우팅 주소를 요청하고 무엇을 반환할지 확인하세요. 🎜🎜🎜Error return🎜🎜🎜 코드의 프롬프트에 따라 인덱스 컨트롤러로 이동하여 _empty
메소드를 실행한 다음 다시 요청하여 무슨 일이 일어나는지 확인하세요. 🎜인쇄 결과를 보면 액세스한 메소드가 존재하지 않을 때 이 메소드가 실행되는 것을 볼 수 있습니다_empty
.
그럼 이 메서드는 어떻게 실행되나요? 이 실행 방법은 반사 메커니즘을 사용하여 달성됩니다. 이전에 반사 Kaka를 설명하는 특별 문서가 있지만 여전히 문서를 읽고 봐야 합니다.
세 번째 경우: 클래스에 실행 가능한 메서드나 _empty 메서드가 없습니다
이 경우는 비교적 간단하며, 오류 메시지를 직접 반환할 뿐입니다. 여기서 예외 처리에 대해서도 나중에 설명하겠습니다.
세 가지 상황을 실행한 후
세 가지 상황을 분석한 후 최종적으로 통계적 방법이 구현됩니다.
반사 실행 클래스를 호출하는 방법은 매개변수 바인딩을 지원합니다. 이는 여기서 클로저 실행 프로세스가 여기서 완료된다는 의미입니다.
다음 자동 요청은 섹션 5에 자세히 설명되어 있습니다.
이전 섹션에서는 3~4주기에 대한 라우팅을 설명했고 마지막 설명은 라우팅 스케줄링입니다. 설정된 라우팅을 실행하는 방법!
다음에는 이 경로를 케이스로 사용하세요
경로 감지를 시작했을 때 반환 값이 무엇인지 아직도 기억하시나요? 아래 사진을 봐주세요
당시에는 아래 코드에 대한 자세한 설명이 없었는데, 제가 하고 싶은 말은 바로 컨트롤러의 인스턴스화였습니다. 이제 현재 일정 정보 기록
암호. 记录当前调度信息
这行代码。
在这里$this->request
$this->request
존재하지 않는 속성에 액세스할 때 컨테이너 클래스의 매직 메서드를 실행하는 데 사용되며, 최종적으로 컨테이너를 통해 인스턴스를 반환합니다. 그래서 코드는 현재 요청의 일정 정보를 설정하거나 얻기 위해 아래 표시된 위치에서 실행됩니다🎜컨트롤러 인스턴스화에서 여기를 인쇄하면 여기에 반환된 값이 index
라는 것을 알 수 있습니다. 다음으로 컨트롤러로 이동합니다. 밖으로.
라우팅 주소를 사용하여 init 메소드로 결과를 인쇄하여 결과를 볼 수 있습니다.
여기 값이 왜 바뀌었는지 아시나요?
위에 인쇄된 값은 아래 사진인데 왜 여기 위 사진인가요!
라우팅 섹션의 마지막 단계는 라우팅 스케줄링을 시작하고 마지막으로 모듈/컨트롤러/작동 방법에 대한 라우팅을 호출하는 것입니다.
이 방법은dispatchModule code>마지막으로 클래스가 인스턴스화됩니다. 다음으로 이 클래스를 심층적으로 연구해야 합니다<code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,.05); font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">dispatchModule
最后也是实例化一个类,接下来需要对这个类进行深究
根据代码追踪可以看到其实就是thinkroutedispatchModule
这个类
来到Module
这个类,又会发现继承着Dispatch
类
在thinkphp/library/think/route/Dispatch.php
这个类的控制器中,会发现对dispatch
thinkroutedispatchModule 코드>이 클래스 🎜🎜<img src="https://img-blog.csdnimg.cn/20201111141709893.png" alt="클래스 별칭" style="max-width:90%"> 클래스 🎜🎜🎜 별칭 제공<code style="font-size: 14px; break-word; ; 테두리 반경: 4px; 여백: 0 2px; 배경색: rgba(27,31,35,.05); 글꼴 계열: 연산자 Mono, Consolas, Monaco, word-break: break-all ; color: rgb (271, 93, 108);">모듈
이 클래스는 디스패치
클래스🎜🎜🎜 thinkphp/library/think/route/Dispatch.php
이 컨트롤러에서 클래스에서 dispatch
설정됩니다. 🎜뒤돌아서 이 시간을 살펴보세요모듈/컨트롤러/작업으로 경로 지정
여기서 메소드에 전달된 매개변수는 무엇입니까, 하하ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
这里的方法传入的参数是什么,哈哈
所以说最终的值就是刚刚打印的只是单独的数组形式的。
那么接下来的动作就跟不使用路由访问的流程一样的,就不用在进行解析了。
直到这里关于路由地址是怎么进行控制器实例化的就结束了。
关于给$this->app->controller
传入的是index
,返回的是整个类名,具体的实现过程就不去解析了,实现的方法是$this->parseModuleAndClass
$this->app->
는 색인
전체 클래스 이름이 반환되며 특정 구현 프로세스는 구문 분석되지 않습니다. 구현 방법은 $this->parseModuleAndClass
를 통해 직접 조사할 수 있습니다! 🎜🎜🎜🎜🎜 3. autoResponse 스케줄링 실행 🎜🎜🎜🎜🎜 4번째 섹션에서는 실행 컨트롤러의 메소드가 아래 그림의 위치에서 반환된다는 것만 언급될 뿐, 반환 방법에 대해서는 자세히 설명하지 않습니다. 🎜🎜 다음으로 실행 방법에 대해 잠시 설명하는 시간을 갖도록 하겠습니다. 🎜접속 라우팅 주소는 아래와 같습니다. 반환된 데이터가 컨트롤러에서 반환해야 하는 데이터임을 알 수 있습니다.
인쇄된 값은 아래 그림과 같습니다. 여기서는 명확해야 합니다. 소스 코드를 읽으려면 약간의 탐색이 필요하며 시간이 지나면 내용을 이해할 수 있습니다.
다음으로 $this ->autoResponse($data);
심층적인 분석을 수행하는 방식입니다. 말 그대로 자동 응답을 의미합니다. $this->autoResponse($data);
这个方法进行深入的解析,这个方法按照字面意思就是ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?。
在这个执行流程的第一行中$data instanceof Response
$data 인스턴스of 응답
이것을 이해하지 못하면 읽을 수 없습니다. 🎜당신이 모르고 이해하지 못하는 것은 여전히 해결되어야 합니다. 소스 코드를 읽고 조금씩 정복하면 승리할 수 있습니다.
instanceof 사용 정보
Instanceof는 객체가 특정 클래스의 인스턴스인지, 객체가 특정 인터페이스를 구현하는지 여부를 확인할 수 있습니다.
다음으로 Kaka는 이를 설명하기 위해 간단한 예를 제공하고 무슨 일이 일어나고 있는지 이해하게 될 것입니다.
케이스 1
먼저 두 개의 클래스를 생성합니다. 케이스는 아래와 같습니다.
아래 그림은 인쇄 결과인데 첫 번째는 true를 반환하고 두 번째는 false를 반환하는 것을 볼 수 있습니다.
는 객체가 특정 클래스의 인스턴스, 즉 $instance
就是类Test
의 인스턴스인지 확인하여 true를 반환합니다.
케이스 2
케이스 2는 인터페이스가 설정되고 클래스가 인터페이스를 구현합니다.
최종 반환 결과는 모두 true입니다. 즉, 클래스가 다른 인터페이스를 구현하면 판단 시 true가 된다는 의미입니다.
위는 instanceof
주어진 두 가지 시연 사례에 대한 이해는 인스턴스가 특정 클래스의 인스턴스인지 여부를 결정하는 것입니다. instanceof
给出的俩种ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?,对其理解就是判断一个实例是否为某个类的实例。
那么就在回到正文,$data instanceof Response
这行代码肯定不会成立,因为data传过来的就是控制器返回的值。
所以说代码执行流程会执行到下图位置,使用了is_null
$data instanceof Response 이 코드 줄은 전달된 데이터가 컨트롤러에서 반환된 값이기 때문에 확실히 작동하지 않습니다. <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"></p>그래서 코드 실행 프로세스는 <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0을 사용하여 아래 표시된 위치까지 실행됩니다. 2px ; 배경색: rgba(27,31,35,.05); 글꼴 계열: 연산자 Mono, Consolas, Monaco, monospace; 단어 나누기: break-all; ) ;">is_null
함수는 판단을 내립니다. 판단은 거짓이어야 하므로 다음 코드가 실행됩니다. 이 코드의 처음 두 지점은 분석되지 않습니다. 첫 번째는 기본적으로 응답 출력 유형을 자동으로 식별하는 것입니다. 이는 Ajax 요청인지 확인하기 위한 것입니다. 이번에는 Kaka가 프레임워크 소스 코드를 구문 분석할 때까지 기다렸다가 시간이 걸립니다. 매일 조금씩 프레임워크의 몇 가지 방법을 수행합니다. 🎜🎜두 번째 위치는 구성 파일에서 해당 구성 정보를 얻는 것입니다. 실행되는 규칙 클래스의 메소드를 살펴보는데, 메소드에는 구성 정보를 얻기 위해 실행되는 코드가 있습니다. 🎜그 다음에는 위에서 언급하지 않은 세 번째 부분인 code$response = Response::create($data, $type);
$response = Response::create($data, $type);
来到类thinkphp/library/think/Response.php
的方法create
中,这个方法就是用来ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?。
这里只需要去关注一下咔咔圈出来的地方即可,在thinkphp/library/think/response
thinkphp/library/think/Response.php
create
, 이 메소드는 Response 객체를 생성하는 데 사용됩니다. 여기서 thinkphp/library/think/response
이 디렉토리에는 HTML이 없습니다. 응답 개체 만들기
🎜🎜이 클래스의 생성자에 오면 주로 몇 가지 작업을 수행합니다. 🎜그런 다음 코드는 반환 값을 autoResponse
$response 이 변수입니다. <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,.05); font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">autoResponse
这个方法的$response
这个变量。
最后就是将这个$response
$response
아래와 같이 결과를 반환하고 인쇄합니다. 그러면 코드는 여전히 상위 레이어로 돌아가 원래의 클로저 기능으로 돌아갑니다. Kaka가 동그라미 친 부분의 다음 코드도 미들웨어에 관한 것입니다. 최종 반환 결과가 그림에 인쇄된 결과와 동일하다는 점만 알아두시면 됩니다. 🎜최종 반환 결과는 thinkphp/library/think/route/Dispatch.php
, 여기서부터 분석을 시작합니다. thinkphp/library/think/route/Dispatch.php
,咱们也就是从这里开始的解析的。
将返回的结果返回给$data
,然后在进行执行return $this->autoResponse($data);
你没看错,这里的代码熟悉吧!
这个时候返回的结果就是Response
的实例,所以会直接返回$response
읽으신 내용이 맞습니다. 여기에 있는 코드는 익숙할 것입니다!
이번에 반환된 결과는 응답
인스턴스이므로 $response
.
“배움에 대한 끈기, 블로그에 대한 끈기, 공유에 대한 끈기는 카카가 경력 이후부터 지켜온 신념입니다. 거대한 인터넷에 올라온 카카의 글이 여러분에게 조금이나마 도움이 되기를 바랍니다. 카카, 다음 호에서 만나요
”
위 내용은 ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!