위에서 알 수 있습니다$instance의 값은 appindexcontrollerIndex의 인스턴스. $instance的值就是appindexcontrollerIndex的实例。
这块也是存在中间件的概念,依然如此中间件会在后文中单独提到,这里不做解释。
在这里$this->app['middleware']->controller
이것에도 미들웨어 개념이 있습니다. 그래도 마찬가지로 미들웨어에 대해서는 다음 글에서 따로 언급할 것이므로 여기서는 설명하지 않겠습니다. 여기$this->app[' middleware ']->controller 이 코드를 사용할 때 ArrayAccess인지 __get인지 기억할 수 있나요?
여기에서는 객체에 액세스하기 위해 배열 액세스 형식을 사용하므로 두 개념을 명확하게 구분해야 합니다.
🎜🎜🎜Reflection을 통해 컨트롤러 메소드를 실행
그러면 메소드 이름을 얻을 수 있습니다. 메소드 이름을 얻는 방법은 이 클래스의 init 메소드에서 실행됩니다. 여기서는 반환된 값이 다음과 같다는 것만 알면 됩니다. 색인. index即可。
여기서 주목해야 할 것은 다음 코드 줄입니다$ this->rule->getConfig('action_suffix'), 여기서 얻은 것은 작업 메서드 접미사입니다.
연산 방법 접미사이제 이 연산 방법 접미사에 값을 설정하면 어떤 모습일까요! 카카 값을 추가하고 액세스하여 결과가 어떻게 나올지 확인하세요.
🎜테스트용으로 카카를 추가했습니다
이때 접속하면 indexkaka 메소드가 명확하게 표시되지 않는다는 메시지가 표시됩니다. 이는 이 매개변수가 모든 메소드 이름에 카카를 추가한다는 의미입니다.
결과 액세스
현재 작업 이름을 얻기 위한 코드 확장이 완료된 후 다음 단계는 if (is_callable([$instance, $action])) {, 여기서 우리의 오랜 친구를 볼 수 있습니다is_callable. if (is_callable([$instance, $action])) {,在这里可以看见我们的老朋友is_callable。
위에서 is_callable의 두 매개변수가 무엇인지 알 수 있습니다. 첫 번째 매개변수는 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
인덱스 클래스에 인덱스 메소드가 있기 때문에 여기서는 분명히 true가 반환됩니다.
여기에서 테스트하기 전에 앱 구성 파일에서 방금 구성한 메서드 이름 접미사를 취소해야 합니다.
이를 통해 0.05); 글꼴 계열: "Operator Mono", Consolas, Monaco, Menlo, monospace; word-break: break-all;">is_callable 존재할지 여부를 판단합니다. 세 가지 상황, 카카가 이를 세 가지 측면에서 분석합니다. 🎜🎜🎜첫 번째 상황: 클래스에 실행 가능한 메서드가 있습니다🎜🎜
먼저 ReflectionMethod 클래스를 반환
메서드 이름 인덱스 가져오기
메서드 이름 접미사가 설정되지 않고 비어 있음을 반환
현재 작업 이름을 설정
이 경우, 매개변수가 설정되지 않았으므로 결국 $vars는 빈 배열입니다.
매개변수가 포함된 이 코드 조각을 테스트하려면 라우팅 주소를 약간 변경해야 합니다.
코드 일부 테스트
이전에는 라우팅을 사용하지 않았지만 기본 주소를 직접 사용했습니다. 이 라우팅 주소는 다음
테스트에 새 라우팅 주소를 사용합니다. 사용 이 라우팅 주소에 대한 데이터를 인쇄해 보면 우리가 설정한 라우팅 매개변수임을 알 수 있습니다.
데이터 인쇄
요청 변수를 얻는 이 방법은 $this->request->param();이 코드 줄$this->request->param();这行代码
프레임워크가 매개변수를 얻는 방법🎜🎜액세스 주소: http://www.source.com/index.php/hello/hello🎜🎜위에서 알 수 있듯이 $this->request->param() 매개변수 가져오기 그렇다면 프레임워크에서 매개변수를 어떻게 얻나요? 🎜🎜프로세스 코드에 따르면 아래와 같이 실행됩니다. 획득한 요청 방법에 따라 매개변수를 얻으려면 해당 방법을 사용하십시오. 여기서 분명히 해야 할 것은 get 요청을 사용한다는 것입니다. 🎜🎜그래서 코드는 $this- > param, 현재 요청 매개변수와 URL 주소의 매개변수가 여기에 병합됩니다. 🎜
Kaka는 라우팅을 사용하여 요청을 하기 때문에 여기 프레임워크는 라우팅을 위한 요청 매개변수를 구체적으로 캡슐화합니다.
현재 요청의 매개변수 가져오기
여기로 오세요route 메소드. 주석을 보면 라우팅 매개변수를 얻는 데 사용된다는 것을 알 수 있지만 여전히 입력 레이어에 들어가야 합니다. route方法,看到注释就明白是用来获取路由参数的,但是还是需要在进入一层到input。
获取路由参数
在之前路由的那一期文章中在获取到路由参数的时候会把参数合并到request的route属性。
设置路由变量
所以说$this->route
🎜🎜🎜 라우팅 매개변수 얻기🎜🎜🎜라우팅에 대한 이전 기사에서 라우팅 매개변수를 얻으면 매개변수가 요청의 경로 속성에 병합됩니다. 🎜🎜🎜🎜🎜 라우팅 변수 설정🎜🎜🎜$this-> ;route는 라우팅 매개변수를 포함하여 이 라우팅 규칙의 모든 매개변수를 저장합니다. 🎜
결과 인쇄
이때 위의 $this->route전달된 매개변수가 false이므로 이 블록이 직접 반환됩니다. $this->route穿进来的参数是false,所以说这块会直接返回。
获取变量 支持过滤和默认值
这里返回的结果会返回给上文我们开始解析的地方,也就是说这个$vars
변수 얻기는 필터링 및 기본값을 지원합니다. 여기에 반환된 결과는 위에서 구문 분석을 시작한 위치, 즉 $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 메소드를 설정하세요
인쇄 결과를 보면 액세스한 메소드가 존재하지 않으면 이 메소드가 실행되는 것을 볼 수 있습니다_empty.
결과 인쇄
이 메소드는 어떻게 실행되나요? 이 실행 방법은 반사 메커니즘을 사용하여 달성됩니다. 이전에 반사 Kaka를 설명하는 특별 문서가 있지만 여전히 문서를 읽고 봐야 합니다.
세 번째 경우: 클래스에 실행 가능한 메서드나 _empty 메서드가 없습니다
이 경우는 비교적 간단하며, 오류 메시지를 직접 반환할 뿐입니다. 여기서 예외 처리에 대해서도 나중에 설명하겠습니다.
세 번째 상황
세 가지 상황 실행 후
세 가지 상황 분석을 거쳐 최종적으로 통계적 방법이 구현됩니다.
반사 실행 클래스를 호출하는 방법은 매개변수 바인딩을 지원합니다. 이는 여기서 클로저 실행 프로세스가 여기서 완료된다는 의미입니다.
다음 자동 요청은 섹션 5에 자세히 설명되어 있습니다.
통계적 실행
2. 라우팅 주소로 컨트롤러를 인스턴스화하는 방법
이전 섹션에서는 3~4주기에 대한 라우팅을 설명했고, 마지막 설명은 여기까지입니다. 그렇다면 설정된 라우팅을 실행하는 방법!
다음에는 이 경로를 케이스로 사용하세요
케이스 루트
경로 감지를 시작할 때 반환 값이 무엇인지 아직도 기억하시나요? 아래 사진을 봐주세요
경로 감지
결과 인쇄
당시에는 아래 코드에 대한 자세한 설명이 없었습니다. 제가 원하는 것은 바로 인스턴스화 컨트롤러였습니다. 지금 말하는 것은 현재 일정 정보 기록 이 코드 줄. 记录当前调度信息这行代码。
在这里$this->request
여기$this->request code > 존재하지 않는 속성에 접근할 때 컨테이너 클래스의 매직 메소드를 실행하고, 최종적으로 컨테이너를 통해 인스턴스를 반환하는 데 사용됩니다. 🎜
그래서 아래 그림의 위치에 코드가 실행되어 현재 요청의 일정 정보를 설정하거나 가져옵니다
현재 요청의 일정 정보를 설정하거나 가져옵니다
여기에서 찾을 수 있습니다. 여기에서 컨트롤러 인스턴스화에 인쇄합니다. 반환된 값은 index입니다. 다음으로 컨트롤러로 이동하여 확인하세요.
데이터 인쇄
라우팅 주소를 사용하여 결과를 인쇄하려면 init 메소드로 오세요
데이터 인쇄
라우팅 주소 사용
라우팅 주소가 사용되지 않습니다
여기 값이 왜 바뀌었는지 아시나요?
위에 인쇄된 값은 아래 사진인데 왜 여기 위 사진인가요!
결과 인쇄
라우팅 섹션의 마지막 단계는 라우팅 스케줄링을 시작하고 마지막으로 모듈/컨트롤러/작동 방법에 대한 라우팅을 호출하는 것입니다.
라우팅 예약
이 방법은dispatchModule마지막으로 클래스를 인스턴스화합니다. 다음으로 이 클래스를 심층적으로 연구해야 합니다
모듈/컨트롤러/작업에 대한 경로
코드 추적에 따르면 실제로는 thinkroutedispatchModule이 클래스thinkroutedispatchModule这个类
그런 다음 $data 인스턴스 응답 이 코드 줄은 전달된 데이터가 컨트롤러에서 반환된 값이기 때문에 확실히 설정되지 않습니다. 그래서 코드 실행 프로세스는 is_null 함수는 판단을 내립니다. 판단은 거짓이어야 하므로 다음 코드가 실행됩니다. 🎜🎜이 코드의 처음 두 지점은 분석되지 않습니다. 🎜
첫 번째는 기본적으로 응답 출력 유형을 자동으로 식별하는 것입니다. 이는 Ajax 요청인지 여부를 확인하는 것입니다. 이번에는 KaKa가 프레임워크 소스 코드를 구문 분석할 때까지 기다린 후 매일 시간이 걸립니다. 프레임워크의 몇 가지 방법을 검토합니다.
두 번째 위치는 구성 파일에서 해당 구성 정보를 얻는 것입니다. 실행되는 규칙 클래스의 메소드를 살펴보는데, 메소드에는 구성 정보를 얻기 위해 실행되는 코드가 있습니다.
코드 실행 과정의 첫 번째 지점
그런 다음 위에서 언급하지 않은 세 번째 부분인 코드 $response = Response::create($data, $type);$response = Response::create($data, $type);
그런 다음 코드는 반환 값을 autoResponse这个方法的$response이 변수에 할당합니다.
마지막으로 다음 $responsegive 아래와 같이 결과를 반환하고 인쇄합니다. $response给返回出去,并且返回信息如下图打印结果。
在这里插入图片描述
打印出返回信息
然后代码依然会向上层返回,回到最初的闭包函数。
在咔咔圈出来的地方,下一行代码也是关于中间件,只需要知道最终返回结果跟上图打印的结果一样即可。
返回到中间级件那一层
最终返回结果回到thinkphp/library/think/route/Dispatch.php
여기에 이미지 설명을 삽입하세요
반품 정보를 인쇄하세요 🎜그런 다음 코드는 여전히 상위 레이어로 돌아가 원래의 클로저 기능으로 돌아갑니다. 🎜🎜Kaka가 동그라미 친 부분의 다음 코드도 미들웨어에 관한 것입니다. 최종 반환 결과가 그림에 인쇄된 결과와 동일하다는 점만 알아두시면 됩니다. 🎜🎜🎜중간 수준으로 돌아가기 🎜최종 결과는 thinkphp/library/think/route/Dispatch.php, 여기서부터 분석을 시작했습니다. 🎜🎜🎜🎜여기에 이미지 설명 삽입
결과를 $data를 입력하고 return $this->autoResponse($data);$data,然后在进行执行return $this->autoResponse($data);