"이 글은 계속해서 라우팅 소스 코드에 대한 설명입니다. 이 글을 보시면 이전에 작성한 라우팅 글을 보실 수 있으며, 총 2개의 글이 있습니다.
이 글에서는 계속해서 ThinkPHP 라우팅 소스 코드 분석에 대해 설명할 예정이며, 이는 라우팅 내용의 끝이기도 합니다. 나중에 라우팅 스케줄링에 대한 글이 나올 예정입니다.
라우팅에 관해서 카카는 프레임워크 전체에서 소스코드 읽기의 핵심 포인트가 가장 어렵다고 느끼고 있으며, 시간도 많이 소모합니다.
그 안에는 중첩된 클래스가 많기 때문에 $this->group의 이 점과 같은 상식을 따르는 것이 좋습니다.
단순한 호출 관계이지만, 소스 코드에서 실행되는 함수가 많습니다.
일반적인 소스 코드에서는 이 그룹이 단순한 클래스라고 생각합니다. 실제로는 그렇지 않습니다. 반환된 최종 결과는 약간 놀랍습니다.
따라서 프레임워크에 관한 모든 것을 주의 깊게 이해해야 합니다. 소스 코드를 읽는 것은 주로 프레임워크와 해당 디자인 아이디어에 대한 이해를 높이기 위한 것입니다.
그래도 단계를 따르세요. 먼저 채굴기의 실행 흐름도를 살펴보세요. 그런 다음 흐름도를 기반으로 기사를 명확하게 읽을 수 있습니다.
나중에 읽는 모든 소스코드는 여기에 직접 추가하여 보완하겠습니다.
이전 글의 마지막 부분은 아래 사진의 위치에 관한 것입니다. 당분간은 이 빈 위치가 다음에 논의할 병합 그룹화 매개변수입니다.
파라미터 병합은 실제로 라우팅 매개변수와 기본 매개변수를 병합하는 것을 의미합니다.
실행 과정을 명확하게 보여주기 위해 카카는 실행 과정에 동그라미를 쳤습니다.
실행 파일:
thinkphp/library/think/App.php -> <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) ; 글꼴 계열: 연산자 Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">$dispatch = $this->route->check ($path, $must);
thinkphp/library/think/App.php
-> $dispatch = $this->route->check($path, $must);
thinkphp/library/think/Route.php
-> $result = $domain->check($this->request, $url, $completeMatch);
thinkphp/library/think/route/Domain.php
-> $result = $this->checkRouteAlias($request, $url);
-> return parent::check($request, $url, $completeMatch);
thinkphp/library/think/route/RuleGroup.php
-> $this->mergeGroupOptions();
thinkphp/library/think/Route.php
-> $result = $domain->check($this- >request, $url, $completeMatch);
🎜🎜thinkphp/library/think/route/Domain.php
-> $result = $this->checkRouteAlias($request, $url);
-> return parent::check($request, $url, $ CompleteMatch);
🎜🎜🎜🎜thinkphp/ 라이브러리/생각/경로/RuleGroup.php
-> $this->mergeGroupOptions();
🎜🎜🎜🎜对应执行关系:🎜예 이 섹션의 제목을 보십시오: 라우팅 매개변수 감지 및 패킷 라우팅 확인 경로 감지에는 여전히 많은 내용이 있습니다.
카카는 그룹 매개변수 병합과 그룹 라우팅 확인에만 집중할 뿐입니다. 마지막으로 다른 콘텐츠는 전체 라인을 관통하지 않으므로 깊이 논의하지 않겠습니다.
다음 글에서는 컨트롤러의 일부에 대해 이야기하겠지만, 전부가 쓰여지는 것은 아닙니다!
그룹화 매개변수 병합
먼저 이 콘텐츠에 대해 이야기해 보겠습니다.
이 콘텐츠를 보기 전에 $this->parent
를 클릭하여 이 속성을 보고 이 값이 어떻게 설정되어 있는지 확인하세요. $this->parent
这个属性进行查看,看这个值是设置成了什么。
通过debug_backtrace()对其打印可以得知为Domain的实例化类。
接下来就进入到mergeGroupOptions
mergeGroupOptions
자세히 설명했습니다. 🎜반환 결과는 아래 그림을 참조하세요
최종 반납 결과
최종 분석에서는 공식적으로 지원되는 라우팅 매개변수를 병합합니다. , 아래 그림을 참조하여 지원되는 버전 번호를 확인하세요.
일반적으로 우리는 라우팅 매개변수를 사용하지 않습니다. 여기서는 매개변수가 존재한다는 것을 모두에게 알리기 위해 언급합니다. 꼭 사용하려는 경우 버전 번호를 명확하게 확인하세요. 그렇지 않으면 많은 문제가 발생할 수 있습니다.
그룹 라우팅 확인
파일: thinkphp/library/think/route/RuleGroup.php Line 183.
여기서 먼저 $rules 변수의 값이 무엇인지 명확히 해야 합니다.
$rules 값을 출력해 보면 두 가지 상황이 있음을 알 수 있습니다.
첫 번째 경우는 리소스 라우팅이 아닙니다.
두 번째 경우는 리소스 라우팅입니다.
이는 Kaka가 라우팅 파일에 리소스 경로 하나와 비자원 경로 하나, 두 개의 경로만 설정하기 때문입니다.
위 그림에서 동그라미 안의 데이터를 보면 루프가 실행될 때 $item의 값이 두 가지 상황으로 나뉘는 것을 알 수 있습니다.
thinkrouteResource 개체 실행
확인 방법 执行thinkrouteResource Object
中的check方法执行thinkrouteRuleItem Object
中的check方法根据神器的打印结果可以看到当为资源路由时 也是执行的thinkphp/library/think/route/RuleGroup.php
검사를 실행합니다. thinkrouteRuleItem 객체의 메소드
Artifact Print리소스 라우팅이 thinkphp/library/think/route/RuleGroup.php🎜Resource 클래스가 RuleGroup 클래스를 상속하기 때문에 검사를 실행하는 이유. 🎜
그리고$item
의 값은 Resource 클래스 인스턴스이므로 확인 방법은 다음과 같습니다. 실행. $item
的值是Resource
类的实例,所以会进行执行check方法。
所以说拥有神器是多么的重要,关于这个神器在之前的文章进行过深入的讲解如何使用,如果你还不会,或者不知道这个用法赶紧去看看哈!神器是可以直接打印出代码的执行流程,在调试源码的过程中是非常有用的。
经过再一次的执行check
다른 실행 후check
방법, 최종 결과는 아래 그림에 원으로 표시된 대로 반환됩니다.
경로 그룹화 감지
파일: thinkphp/library/think/route/RuleItem.php 줄번호 231 비자원 경로 실행 방법입니다.
라우팅 규칙 감지 방법을 입력한 후에도 라우팅 매개변수는 계속 병합됩니다.
🎜🎜🎜경로 감지🎜🎜🎜라우팅 매개 변수를 병합하는 방법은 위에서 언급했으므로 여기서는 자세히 설명하지 않겠습니다. 🎜지금까지 탐지 라우팅에서 그룹 매개변수 병합 및 그룹 라우팅 확인에 대한 설명을 마쳤습니다. 아이디어가 확실하지 않은 경우 마인드맵을 보면 됩니다.
다음 사례에서는 일반 라우팅을 사용합니다. 파일을 사용하는 경우는 없습니다. thinkphp/library/think/route/RuleItem.php
아티팩트를 사용하여 데이터를 인쇄합니다.
위는 전체 실행 프로세스입니다. 다음으로 URL과 규칙 라우팅이 일치하는지 구문 분석하고 감지해야 합니다.
여기서 콘텐츠를 시작하기 전에 먼저 Kaka의 문제를 해결해 보겠습니다.
위 코드의 상위 레이어로 이동하여 반환 결과를 인쇄하세요.
그런 다음 라우팅 구성 파일인 Route.php를 살펴보세요.
이 파일에서 Kaka는 두 개의 라우팅 주소만 구성하며 그 중 하나만 리소스 경로이며 가변 규칙이 설정되어 있습니다.
이때, 라우팅 구성 파일에 라우팅 주소를 추가해 주세요.
그런 다음 기사 시작 부분에 결과를 인쇄하세요.
여기에 질문이 있습니다. 왜 false를 반환합니까?
URL과 규칙 경로가 일치하는지 확인하면 false가 반환되는 이유를 해결하려면
그런 다음 원본 지점으로 이동하여 확인해야 합니다.
이 섹션의 내용은 위에서 설명했습니다. 여기에는 항목에 대한 두 가지 상황이 있습니다. 执行thinkrouteResource Object
,第二种为执行thinkrouteRuleItem Object
파일을 실행thinkphp/library/think/route/RuleItem.php
中的check
하고 반환해야 한다는 것을 알 수 있다는 것은 매우 분명합니다.
이 두 줄의 코드를 보면 $match 변수가 관련되어 있어야 한다는 것을 이해할 수 있습니다.
이 변수는 URL과 규칙 라우팅이 일치하는지 확인하는 데 사용됩니다. 이는 처음에 말한 내용으로 돌아갑니다.
그래서 소스코드는 이렇게 링크별로 링크를 걸어놓고 천천히 읽어보시면 이해가 되실 겁니다.
공식적으로 코드 구문 분석 시작
매개변수 설명
실행 파일: 파일: thinkphp/library/think/route/RuleItem.php
구체적인 구현에 대해 자세히 살펴보겠습니다.
우선 라우팅이 완전히 일치하는지 판단하게 됩니다. 라우팅을 해석하는 과정에서 그러한 판단이 많이 등장하게 되는데, 나중에 Kaka가 그 이유를 설명하기 위해 별도의 글을 게시할 예정입니다. 판단이 필요합니다.
그런 다음 라우팅 규칙을 병합하는 코드가 실행됩니다. 이 프로세스는 라우팅 규칙을 병합합니다.
getPattern 메소드로 오세요. 라우팅 규칙이 설정되지 않았기 때문에 직접 반환됩니다. 라우팅 규칙의 이 변수의 초기 값은 빈 배열이므로 병합 후에도 여전히 빈 배열입니다.
코드의 두 번째 줄, 정확히 무엇이 실행되는지에 대해 의문이 생길지 모르겠습니다.
이 클래스의 생성자에서 // 라우팅 인스턴스인 thinkRoute를 주입하기 위해 종속성 주입이 수행됩니다.
코드 추적에 따르면 구성 정보에서 구성 정보를 가져옵니다. 반환된 결과는 문자열(1) "/"
string(1) "/"
在接着对路由规则进行处理,将所有的|改为/
根据上图给返回的$rule可以明确的一件事就是下边的判断不会执行。
在这里需要了解一个方法就是preg_quote:函数用于转义正则表达式字符
所以最后这个slash这个变量会返回为string(6) "/-/"
string(6) "/-/"
, 모든 백슬래시는 이스케이프 문자입니다. 🎜preg_replace 함수는 문자열을 정규식으로 구분합니다.
strncasecmp() 함수는 두 문자열을 비교합니다(대소문자를 구분하지 않음).
preg_match_all 함수는 전역 정규식 일치를 수행하는 데 사용됩니다.
preg_match_all 함수는 전역 정규식 일치를 수행하는 데 사용됩니다.
이 방법에는 대부분의 사람들에게 매우 생소한 몇 가지 기능이 있으며, 정보는 직접 확인할 수 있으며 카카는 이러한 방법의 사용법을 설명하지 않습니다.
위는 URL 변수와 규칙 경로가 일치하는지 탐지하는 내용입니다. 이 블록의 기능은 주로 다음과 같습니다.
Kaka는 여기서 흐름도를 빼놓지 않습니다. Kaka에서 제공하는 코드 디버깅 도구에 따라 디버깅하거나, 위에서 Kaka에서 제공하는 가이드를 보면 됩니다.
라우팅이 곧 종료됩니다. 남은 내용은 라우팅 일정, 라우팅 일정 및 최종 라우팅 실행 결과가 누구에게 반환되는지에 대한 것입니다. 다음으로 Kaka가 라우팅에 대해 논의하겠습니다. 일정을 자세히 분석합니다.
이 글은 주로 라우팅 매개변수, 라우팅 변수 및 규칙에 대해 다루고 있습니다. 이 내용은 이전 글과 함께 읽어야 합니다. 관심이 있는 경우에는 PHP 중국어 웹페이지로 돌아가서 읽어보시기 바랍니다. 확인해 보세요!
“배움에 대한 끈기, 블로깅에 대한 끈기, 공유에 대한 끈기는 카카가 경력 이후부터 지켜온 신념입니다. 거대한 인터넷에 올라온 카카의 글이 여러분에게 조금이나마 도움이 되기를 바랍니다. 카카 다음호에서 만나요
”
위 내용은 ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!