접두사 밑줄 문자 가 있거나없는 모든 매개 변수를 다루는 것은 무엇입니까 ?
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'
답변
다음은 라우팅 시스템에 대한 아이디어와 드루팔에 대한 추가 사항에 대한 좋은 설명입니다.
일반 개요
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'
참고 : 이것은 더 많은 이야기 할 점이 있지만 내 관점에서 가장 중요한 점을 다룹니다.