라우팅 파일이 밑줄로 채워지는 이유는 무엇입니까?


24

접두사 밑줄 문자 가 있거나없는 모든 매개 변수를 다루는 것은 무엇입니까 ?

Drupal은 이러한 매개 변수를 처리하는 방법을 어디에서 결정합니까?

이 개념이 Symfony에서 소개 되었습니까 아니면 Drupal에 새로 도입 되었습니까?

( node.routing.yml ) :

node.overview_types:
  path: '/admin/structure/types'
  defaults:
    _controller: '\Drupal\Core\Entity\Controller\EntityListController::listing'
    entity_type: 'node_type'
    _title: 'Content types'
  requirements:
    _permission: 'administer content types'

2
그것은이다 심포니 대회 . 여기에 좋은 기사가 있습니다 . 비트를 찾으십시오 . 마지막으로주의해야 할 것은 매개 변수 이름에서 밑줄 문자의 특별한 의미입니다. 이 문자로 시작하는 매개 변수는 특별한 의미를 갖습니다
Clive

1
고마워 Clive. 이 기사는 "특별한 의미"를 언급하지만 이것을 전혀 설명하지는 않습니다. 밑줄이 아닌 매개 변수도 특별한 이유는 무엇입니까?
Daniel

1
lol, 밑줄이 아닌 매개 변수도 특별 할 수없는 이유는 무엇입니까? , 그것은 본질적으로 존재하는 질문처럼 들립니다! 일반적으로 (보통) 접두사 변수는 '비공개'var (여기서는 아닐 것임)를 나타내거나 시스템의 다른 클래스 / 방법 / 다른 것과 이름 충돌을 피하기 위해 수행됩니다. 공식 문서를 보는 것이 좋을 것입니다. 예
Clive

답변:


41

다음은 라우팅 시스템에 대한 아이디어와 드루팔에 대한 추가 사항에 대한 좋은 설명입니다.

일반 개요

Symfony 컴포넌트에는 두 가지 중요한 개념이 있습니다. http 커널은 요청을받는 시스템으로, 다른 시스템에서 요청 된 출력 (응답 객체)을 생성하는 코드를 정의하고 응답을 클라이언트로 다시 보내도록 요청합니다. 이 코드 조각을 컨트롤러라고 부릅니다. 이것은 순수한 php4와 같은 함수, 객체의 메소드 또는 익명의 함수일 수 있습니다.

현재 요청을 담당하는 컨트롤러를 아는 시스템이 라우팅 시스템입니다.

여기에 이미지 설명을 입력하십시오

기본 라우팅 파일

모듈 개발자는 경로 목록과 해당 컨트롤러를 정의합니다.

다음은 json 응답의 예입니다.

taxonomy.autocomplete_vid:
  path: '/taxonomy/autocomplete_vid/{taxonomy_vocabulary}'
  defaults:
    _controller: '\Drupal\taxonomy\Controller\TermAutocompleteController::autocompletePerVid'
  requirements:
    taxonomy_vocabulary: \d+

대부분의 심포니 문서에는 패턴이 언급되어 있지만 drupal은 라우팅 파일에 사용되지 않는 "경로"키만 허용하기로 결정했습니다.

핵심 개념은 시스템에서 일부 매개 변수를 가져 와서 응답으로 변환하는 컨트롤러입니다. 이 예에서는 'taxonomy_vocabulary'매개 변수가 있습니다. 따라서 밑줄이없는 모든 것은 컨트롤러에 대한 매개 변수로 간주됩니다. 기본값을 지정하려면 기본값 배열에 넣습니다. 동일한 yml 배열에서 '::'에 연결된 클래스와 메소드를 지정하여 시스템에서 항목을 찾을 위치를 알려줍니다. 다른 모든 속성은 컨트롤러 매개 변수와 관련이 없으므로 내부적 인 것으로 간주되므로 접두사로 밑줄이 있습니다.

Symfony 자체는 또한 정규 표현식을 정의하여 수신 매개 변수가 유효한지 ( '요구 사항'사용) 유효성을 검증 할 수 있습니다. 여기서는 숫자와 만 일치합니다.

컨트롤러 리졸버

symfony가 현재 요청에서 활성화 된 컨트롤러를 발견하면 소위 컨트롤러 리졸버에게 컨트롤러의 인스턴스를 작성하도록 요청하며, 이는 call_user_func_array를 통해 실행할 수 있습니다. 제어기 리졸버 참조 컨트롤러에 전달되는 매개 변수를 취득하는 호출 제어기를 얻는 하나의 방법 (+ 객체있어서, 익명 함수) 및 하나의 방법 갖는 컨트롤러 리졸버

드루팔 확장

이것이 기본적으로 심포니가 제공하는 것입니다.

Drupal은 약간 더 복잡합니다.

  • 경로에 대한 액세스를 확인할 수 있습니다. 예를 들어 user_access () 호출은 Drupal 7 이하에서 매우 흔했습니다.
  • taxonomy_vocabulary를 실제 엔티티 오브젝트로 변환하지 않으려는 경우
  • 전체 페이지 응답을 생성하지 않고 "주요 콘텐츠"만 생성하십시오.

액세스 확인

Drupal은 사용자가 현재 경로에 액세스 할 수 있는지 여부를 확인하고 대안으로 403 (액세스 거부) 예외를 발생시키는 시스템을 심포니 파트 위에 도입했습니다. 액세스 관리자

라우팅 파일의 요구 사항 부분에서이를 지정합니다. 가장 일반적인 비트가 예제에 나열되어 있습니다.

  path: '/user/{user}'
  options:
    _access_mode: 'ANY'
  requirements:
    _permission: 'access user profiles'
    _entity_access: 'user.view'
    _role: 'administrator'

_permission은 user_access ()에 대한 호출을 정의하고 _role은 사용자에게 특정 역할이 있는지 확인합니다 (OR의 경우 OR 및 AND의 경우 +를 통해 여러 역할을 지정할 수 있음). _entity_access는 사용자 엔티티를 볼 수있는 액세스 권한이 있는지 엔티티 시스템에 묻습니다. 기본 drupal을 사용하면 액세스 체커를 추가하여 계속 진행할 수 있지만 _access_mode를 통해 옵션으로 전환 할 수 있습니다.

업 캐스팅

목록에 언급 된대로 엔티티로드에주의하지 않으려면 / user / {user}를 참조하십시오. 엔티티의 경우 기본적으로 엔티티 유형의 이름 만 사용하면 URL에 전달 된 ID로 entity_load를 실행합니다. 매개 변수 변환기 관리자

페이지 응답

컨트롤러가 응답 객체를 생성하기 전에 작성되었습니다. 페이지는 해당 영역에 나타나는 모든 블록, html 및 페이지 템플릿 등으로 구성되어 있으므로 Drupal에서 끔찍한 일입니다. 따라서 drupal은 페이지의 내용을 반환하는 컨트롤러를 지정하기 위해 다른 키를 지정했습니다.

user.page:
  path: '/user'
  defaults:
    _content: '\Drupal\user\Controller\UserController::userPage'
  requirements:
    _access: 'TRUE'

정의 된 문자열은 페이지의 주 내용 영역에 대한 렌더 배열을 생성하는 데 사용되는 컨트롤러입니다.

폼이있는 페이지를 반환하는 것은 렌더 배열보다 약간 더 복잡하므로 폼을 처리하는 방법도 있습니다. 따라서 현재 폼을 담당하는 FormInterface를 사용하여 _form을 정의 할 수 있습니다.

user.pass:
  path: '/user/password'
  defaults:
    _form: '\Drupal\user\Form\UserPasswordForm'
  requirements:
    _access: 'TRUE'

참고 : 이것은 더 많은 이야기 할 점이 있지만 내 관점에서 가장 중요한 점을 다룹니다.

TL; DR

  • 밑줄은 컨트롤러에 대한 매개 변수가 아닌 모든 항목에 지정됩니다. 이것은 심포니에서 일종의 "표준"으로 제공됩니다.
  • 이 매개 변수는 매개 변수 변환기 를 통해 업 캐스트 되고 제어기 리졸버를 사용하여 제어기로 전달됩니다.
  • Drupal에는 사람들이 심포니 라우팅 시스템과 쉽게 상호 작용할 수 있도록 몇 가지 추가 기능이 있습니다.

와우. 인상적인 답변. 밑줄을 사용하는 것과 반대로 특정 매개 변수에 마침표가있는 이유는 무엇입니까? 예 user.pass(위의 예에서) 대 user_pass. 그 심포니 컨벤션입니까?
chrisjlee

2
$ module. $ name을 라우트의 기계 이름으로 사용하는 규칙이 있습니다. 그러나 내부적으로는 아무것도 가정하지 않습니다.
Daniel Wehner

아래 문제에 따라 _content는 더 이상 사용되지 않지만 _controller는 사용됩니다. 따라서 페이지 응답 파트 의 예제 가 최신이 아닙니다. drupal.org/node/2378809 페이지의 컨텐츠 영역에 데이터를 표시하려는 경우 컨트롤러는 Drupal 7에서 수행 한 방식과 유사하게 렌더 배열을 정의합니다.이를 무시하고 페이지를 작성하려는 경우 처음부터 응답 객체를 반환 할 수 있습니다.
benelori

확실히, 당신은 1.5 년이 일어날 것이라고 기대할 수 없습니다
Daniel Wehner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.