>PHP 프레임워크 >ThinkPHP >ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.

ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.

咔咔
咔咔원래의
2020-12-01 12:27:202052검색
"

이 글은 계속해서 라우팅 소스 코드에 대한 설명입니다. 이 글을 보시면 이전에 작성한 라우팅 글을 보실 수 있으며, 총 2개의 글이 있습니다.

처음 두 기사의 라우팅 소스 코드를 해석한 후에는 모든 사람이 라우팅에 대해 어느 정도 이해하고 있다고 믿습니다.

이 글에서는 계속해서 ThinkPHP 라우팅 소스 코드 분석에 대해 설명할 예정이며, 이는 라우팅 내용의 끝이기도 합니다. 나중에 라우팅 스케줄링에 대한 글이 나올 예정입니다.

라우팅에 관해서 카카는 프레임워크 전체에서 소스코드 읽기의 핵심 포인트가 가장 어렵다고 느끼고 있으며, 시간도 많이 소모합니다.

그 안에는 중첩된 클래스가 많기 때문에 $this->group의 이 점과 같은 상식을 따르는 것이 좋습니다.

단순한 호출 관계이지만, 소스 코드에서 실행되는 함수가 많습니다.

일반적인 소스 코드에서는 이 그룹이 단순한 클래스라고 생각합니다. 실제로는 그렇지 않습니다. 반환된 최종 결과는 약간 놀랍습니다.

따라서 프레임워크에 관한 모든 것을 주의 깊게 이해해야 합니다. 소스 코드를 읽는 것은 주로 프레임워크와 해당 디자인 아이디어에 대한 이해를 높이기 위한 것입니다.

그래도 단계를 따르세요. 먼저 채굴기의 실행 흐름도를 살펴보세요. 그런 다음 흐름도를 기반으로 기사를 명확하게 읽을 수 있습니다.

나중에 읽는 모든 소스코드는 여기에 직접 추가하여 보완하겠습니다.

ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
프레임워크 실행 프로세스

1. 라우팅-병합 그룹화 매개변수 감지, 그룹화 라우팅 확인

이전 글의 마지막 부분은 아래 사진의 위치에 관한 것입니다. 당분간은 이 빈 위치가 다음에 논의할 병합 그룹화 매개변수입니다.

파라미터 병합은 실제로 라우팅 매개변수와 기본 매개변수를 병합하는 것을 의미합니다.

ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
실행 위치

실행 과정을 명확하게 보여주기 위해 카카는 실행 과정에 동그라미를 쳤습니다.

실행 파일:

  1. 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);
  2. thinkphp/library/think/Route.php -> $result = $domain->check($this->request, $url, $completeMatch);
  3. thinkphp/library/think/route/Domain.php -> $result = $this->checkRouteAlias($request, $url); -> return parent::check($request, $url, $completeMatch);
  4. 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(); 🎜🎜🎜🎜对应执行关系:🎜
  1. 경로 감지는 디스패치 개체를 반환합니다
  2. 도메인 이름 라우팅 감지
  3. 별칭 라우팅 감지 -> 그룹 라우팅 감지
  4. 그룹 매개변수 병합
ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
경로 감지 실행 프로세스

예 이 섹션의 제목을 보십시오: 라우팅 매개변수 감지 및 패킷 라우팅 확인 경로 감지에는 여전히 많은 내용이 있습니다.

카카는 그룹 매개변수 병합과 그룹 라우팅 확인에만 집중할 뿐입니다. 마지막으로 다른 콘텐츠는 전체 라인을 관통하지 않으므로 깊이 논의하지 않겠습니다.

다음 글에서는 컨트롤러의 일부에 대해 이야기하겠지만, 전부가 쓰여지는 것은 아닙니다!

그룹화 매개변수 병합

먼저 이 콘텐츠에 대해 이야기해 보겠습니다.

ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
그룹화 매개변수 병합

이 콘텐츠를 보기 전에 $this->parent를 클릭하여 이 속성을 보고 이 값이 어떻게 설정되어 있는지 확인하세요. $this->parent这个属性进行查看,看这个值是设置成了什么。

通过debug_backtrace()对其打印可以得知为Domain的实例化类。

ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
打印结果

接下来就进入到mergeGroupOptions

debug_backtrace()로 출력하면 Domain의 인스턴스화된 클래스임을 알 수 있습니다. 🎜🎜ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.🎜결과 인쇄 🎜🎜🎜그런 다음 mergeGroupOptions 자세히 설명했습니다. 🎜
  • 실행 파일: thinkphp/library/think/route/RuleGroup.php 164줄
  • $this->parent: class thinkrouteDomain
  • 라우팅 매개변수 정의 가져오기, 라우팅 매개변수가 존재하지 않는 경우, 'merge_rule_regex' => bool(false), 라우팅 매개변수는 어쨌든 추가됩니다
  • 병합 그룹화 매개변수: $this->mergeOptions: 라우팅 매개변수 'after', 'model', 'header' 그룹화, 'response', 'append', 'middleware'
  • array_merge
  • 를 통해 매개변수를 병합하고 lockOption 매개변수
  • 를 잠그고 병합된 결과를 반환하고 마지막으로 결과 $this를 반환합니다. -> 옵션

반환 결과는 아래 그림을 참조하세요ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.

최종 반납 결과

ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
반환 결과

최종 분석에서는 공식적으로 지원되는 라우팅 매개변수를 병합합니다. , 아래 그림을 참조하여 지원되는 버전 번호를 확인하세요.

일반적으로 우리는 라우팅 매개변수를 사용하지 않습니다. 여기서는 매개변수가 존재한다는 것을 모두에게 알리기 위해 언급합니다. 꼭 사용하려는 경우 버전 번호를 명확하게 확인하세요. 그렇지 않으면 많은 문제가 발생할 수 있습니다.

ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
지원되는 라우팅 매개변수

그룹 라우팅 확인

파일: thinkphp/library/think/route/RuleGroup.php Line 183.

여기서 먼저 $rules 변수의 값이 무엇인지 명확히 해야 합니다.

ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
패킷 라우팅 감지

$rules 값을 출력해 보면 두 가지 상황이 있음을 알 수 있습니다.

첫 번째 경우는 리소스 라우팅이 아닙니다.

두 번째 경우는 리소스 라우팅입니다.

ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
$rules value

이는 Kaka가 라우팅 파일에 리소스 경로 하나와 비자원 경로 하나, 두 개의 경로만 설정하기 때문입니다.

ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
라우팅 구성 파일

위 그림에서 동그라미 안의 데이터를 보면 루프가 실행될 때 $item의 값이 두 가지 상황으로 나뉘는 것을 알 수 있습니다.

  • thinkrouteResource 개체 실행 확인 방법
  • 执行thinkrouteResource Object中的check方法
  • 执行thinkrouteRuleItem Object中的check方法
  • 根据神器的打印结果可以看到当为资源路由时 也是执行的thinkphp/library/think/route/RuleGroup.php

    검사를 실행합니다. thinkrouteRuleItem 객체의 메소드
    아티팩트의 출력 결과에 따르면 리소스를 라우팅할 때도 실행되는 것을 확인할 수 있습니다. thinkphp/library/think/route/RuleGroup.php 클래스의 메소드를 확인하십시오. ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    Artifact Print

    리소스 라우팅이 thinkphp/library/think/route/RuleGroup.php

    🎜Resource 클래스가 RuleGroup 클래스를 상속하기 때문에 검사를 실행하는 이유. 🎜

    그리고$item의 값은 Resource 클래스 인스턴스이므로 확인 방법은 다음과 같습니다. 실행. $item的值是Resource类的实例,所以会进行执行check方法。

    所以说拥有神器是多么的重要,关于这个神器在之前的文章进行过深入的讲解如何使用,如果你还不会,或者不知道这个用法赶紧去看看哈!神器是可以直接打印出代码的执行流程,在调试源码的过程中是非常有用的。

    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    继承关系

    经过再一次的执行check

    그래서 아티팩트를 갖는 것이 얼마나 중요한지, 아직 사용법을 모르시거나 사용법을 모르시는 분들을 위해 이전 글에서 이 아티팩트의 사용법에 대해 심도 있게 설명하였습니다. , 가서 확인해 보세요! 아티팩트는 코드의 실행 흐름을 직접 인쇄할 수 있으며 이는 소스 코드를 디버깅하는 과정에서 매우 유용합니다.
    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    상속 관계

    다른 실행 후check 방법, 최종 결과는 아래 그림에 원으로 표시된 대로 반환됩니다.

    경로 그룹화 감지

    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    비자원 경로 실행 확인

    파일: thinkphp/library/think/route/RuleItem.php 줄번호 231 비자원 경로 실행 방법입니다.

    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    비자원 라우팅 실행 방법

    라우팅 규칙 감지 방법을 입력한 후에도 라우팅 매개변수는 계속 병합됩니다.

    🎜🎜🎜경로 감지🎜🎜🎜라우팅 매개 변수를 병합하는 방법은 위에서 언급했으므로 여기서는 자세히 설명하지 않겠습니다. 🎜
    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    라우팅 매개변수 병합

    지금까지 탐지 라우팅에서 그룹 매개변수 병합 및 그룹 라우팅 확인에 대한 설명을 마쳤습니다. 아이디어가 확실하지 않은 경우 마인드맵을 보면 됩니다.

    2. URL 변수와 규칙 라우팅이 일치하는지 확인합니다.

    다음 사례에서는 일반 라우팅을 사용합니다. 파일을 사용하는 경우는 없습니다. thinkphp/library/think/route/RuleItem.php

    아티팩트를 사용하여 데이터를 인쇄합니다.

    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    실행 프로세스
    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    실행 프로세스

    위는 전체 실행 프로세스입니다. 다음으로 URL과 규칙 라우팅이 일치하는지 구문 분석하고 감지해야 합니다.

    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    URL과 규칙 라우팅이 일치하는지 확인하세요

    여기서 콘텐츠를 시작하기 전에 먼저 Kaka의 문제를 해결해 보겠습니다.

    위 코드의 상위 레이어로 이동하여 반환 결과를 인쇄하세요.

    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    콘텐츠 인쇄
    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    결과 인쇄

    그런 다음 라우팅 구성 파일인 Route.php를 살펴보세요.

    이 파일에서 Kaka는 두 개의 라우팅 주소만 구성하며 그 중 하나만 리소스 경로이며 가변 규칙이 설정되어 있습니다.

    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    라우팅 구성 파일

    이때, 라우팅 구성 파일에 라우팅 주소를 추가해 주세요.

    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    라우팅 구성 파일

    그런 다음 기사 시작 부분에 결과를 인쇄하세요.

    여기에 질문이 있습니다. 왜 false를 반환합니까?

    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    URL과 규칙 경로가 일치하는지 확인하고 결과를 인쇄하세요

    URL과 규칙 경로가 일치하는지 확인하면 false가 반환되는 이유를 해결하려면

    그런 다음 원본 지점으로 이동하여 확인해야 합니다.

    이 섹션의 내용은 위에서 설명했습니다. 여기에는 항목에 대한 두 가지 상황이 있습니다. 执行thinkrouteResource Object,第二种为执行thinkrouteRuleItem Object

    모두 check 메소드를 실행합니다.

    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    실행 프로세스의 소스 지점

    파일을 실행thinkphp/library/think/route/RuleItem.php中的check하고 반환해야 한다는 것을 알 수 있다는 것은 매우 분명합니다.

    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    라우팅 감지

    이 두 줄의 코드를 보면 $match 변수가 관련되어 있어야 한다는 것을 이해할 수 있습니다.

    이 변수는 URL과 규칙 라우팅이 일치하는지 확인하는 데 사용됩니다. 이는 처음에 말한 내용으로 돌아갑니다.

    그래서 소스코드는 이렇게 링크별로 링크를 걸어놓고 천천히 읽어보시면 이해가 되실 겁니다.

    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    코드를 기반으로 관계 찾기

    공식적으로 코드 구문 분석 시작

    매개변수 설명

    • $url: 액세스 주소
    • $옵션: 그룹화 매개변수 병합
    • $completeMatch : 입니다 라우팅이 완료되었나요? 일치

    실행 파일: 파일: thinkphp/library/think/route/RuleItem.php

    구체적인 구현에 대해 자세히 살펴보겠습니다.

    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    파싱된 소스 코드

    우선 라우팅이 완전히 일치하는지 판단하게 됩니다. 라우팅을 해석하는 과정에서 그러한 판단이 많이 등장하게 되는데, 나중에 Kaka가 그 이유를 설명하기 위해 별도의 글을 게시할 예정입니다. 판단이 필요합니다.

    그런 다음 라우팅 규칙을 병합하는 코드가 실행됩니다. 이 프로세스는 라우팅 규칙을 병합합니다.

    getPattern 메소드로 오세요. 라우팅 규칙이 설정되지 않았기 때문에 직접 반환됩니다. 라우팅 규칙의 이 변수의 초기 값은 빈 배열이므로 병합 후에도 여전히 빈 배열입니다.

    코드의 두 번째 줄, 정확히 무엇이 실행되는지에 대해 의문이 생길지 모르겠습니다.

    이 클래스의 생성자에서 // 라우팅 인스턴스인 thinkRoute를 주입하기 위해 종속성 주입이 수행됩니다.

    코드 추적에 따르면 구성 정보에서 구성 정보를 가져옵니다. 반환된 결과는 문자열(1) "/"string(1) "/"

    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    合并路由规则

    在接着对路由规则进行处理,将所有的|改为/

    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    对路由规则进行处理

    根据上图给返回的$rule可以明确的一件事就是下边的判断不会执行。

    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.
    判断不会执行

    在这里需要了解一个方法就是preg_quote:函数用于转义正则表达式字符

    所以最后这个slash这个变量会返回为string(6) "/-/"

    ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.🎜라우팅 규칙 병합🎜🎜🎜그런 다음 라우팅 규칙을 처리하고 모두 | /🎜🎜ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.🎜라우팅 규칙을 처리합니다🎜🎜🎜위 그림에서 반환된 $rule에 따라, 한 가지는 아래의 판결은 집행되지 않는다는 점이다. 🎜🎜ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.🎜판단 없음 실행됩니다🎜🎜🎜여기서 알아야 할 한 가지 방법은 preg_quote입니다. 이 함수는 정규식 문자를 이스케이프하는 데 사용됩니다🎜🎜따라서 마지막 슬래시 변수는 string(6) "/-/", 모든 백슬래시는 이스케이프 문자입니다. 🎜

    preg_replace 함수는 문자열을 정규식으로 구분합니다.

    strncasecmp() 함수는 두 문자열을 비교합니다(대소문자를 구분하지 않음).

    preg_match_all 함수는 전역 정규식 일치를 수행하는 데 사용됩니다.

    preg_match_all 함수는 전역 정규식 일치를 수행하는 데 사용됩니다.

    이 방법에는 대부분의 사람들에게 매우 생소한 몇 가지 기능이 있으며, 정보는 직접 확인할 수 있으며 카카는 이러한 방법의 사용법을 설명하지 않습니다.

    Summary

    위는 URL 변수와 규칙 경로가 일치하는지 탐지하는 내용입니다. 이 블록의 기능은 주로 다음과 같습니다.

    • 경로가 완전히 일치하는지 확인하기 위해 사용되는 매개변수는 Complete_match입니다.
    • 라우팅 규칙 병합, 즉 패턴 사용.
    • 가장 중요한 것은 다음 부분에서 주소에 대한 다양한 기능을 다룬다는 점입니다.
    • 최종 반환은 라우팅 매개변수 배열 형태입니다.
    • 위는 라우팅 매개변수가 존재하는 경우입니다. 라우팅 매개변수가 없으면 바로 false가 반환됩니다.
    • 그런 다음 돌아가서 여기에서 일치하는 규칙 라우팅의 구문 분석을 실행하세요.

    Kaka는 여기서 흐름도를 빼놓지 않습니다. Kaka에서 제공하는 코드 디버깅 도구에 따라 디버깅하거나, 위에서 Kaka에서 제공하는 가이드를 보면 됩니다.

    라우팅이 곧 종료됩니다. 남은 내용은 라우팅 일정, 라우팅 일정 및 최종 라우팅 실행 결과가 누구에게 반환되는지에 대한 것입니다. 다음으로 Kaka가 라우팅에 대해 논의하겠습니다. 일정을 자세히 분석합니다.

    이 글은 주로 라우팅 매개변수, 라우팅 변수 및 규칙에 대해 다루고 있습니다. 이 내용은 이전 글과 함께 읽어야 합니다. 관심이 있는 경우에는 PHP 중국어 웹페이지로 돌아가서 읽어보시기 바랍니다. 확인해 보세요!

    배움에 대한 끈기, 블로깅에 대한 끈기, 공유에 대한 끈기는 카카가 경력 이후부터 지켜온 신념입니다. 거대한 인터넷에 올라온 카카의 글이 여러분에게 조금이나마 도움이 되기를 바랍니다. 카카 다음호에서 만나요

    위 내용은 ThinkPHP는 URL 변수와 규칙 라우팅이 일치하는지 감지합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.