컨트롤러가 응답 객체를 반환하지 않으면 커널은 kernel.view 이벤트를 트리거하고 가입자는 컨트롤러의 결과를 실제 응답 객체로 변환 할 책임이 있습니다. 이 유연성을 통해 컨트롤러는 객체를 올바른 응답으로 변환하는 View Event Subscriber와 결합되는 한 컨트롤러가 모든 유형의 객체를 반환 할 수 있습니다.
htmlrenderer 가장 일반적으로 사용되는 주요 콘텐츠 렌더러 유형으로서 페이지 변형 개념을 사용하여 페이지를 빌드합니다. 이 프로세스는 htmlrenderer의 repary () 메소드에서 발생하며, 이는 #type = & gt를 제공합니다. 그런 다음 #type = & gt로 싸서 렌더러 클래스를 사용하여 렌더링하십시오. -
Drupal 8 모듈 개발에 관한 첫 번째 기사 에서이 프로세스의 라우팅 측면에 대해 조금 배웠습니다. 우리는 경로가있는 페이지를 만드는 것이 이제 컨트롤러와 일치하는 경로를 선언하는 데 문제가되는 것을 보았습니다. 우리가 볼 수 있듯이, 후자는 마커로 해석되고 해당 페이지의 기본 내용 영역에 표시되는 렌더링 된 배열을 반환 할 수 있습니다. 그러나 무대 뒤에서 Drupal은 실제로 Symfony의 httpkernelinterface 규정에 따라 그 배열을 - 응답
객체로 변환한다는 것을 알고 있습니까? -
-
이 기사에서는 Drupal 8 (및 Symfony2)의 내부 구조를 더 깊이 살펴보고 사용자가 보는 시간에 요청하는 순간에 실제로 무슨 일이 일어나는지 (그리고 어떤 일이 일어날 지) 이해하고 싶습니다. 그들이 반환하는 응답). 위에서 언급 한 예는이 과정이 갈 수있는 한 방향 일뿐입니다. 오늘날 우리는 다른 가능성을 볼 것입니다. 목표는 시스템의 유연성을 이해하는 것입니다. 이는 우리가 훌륭한 응용 프로그램을 구축하는 데 도움이 될 수 있습니다.
더 깊이 파고 들기 전에이 차트를 확인하는 것이 좋습니다.이 차트는 종종
렌더링 파이프 라인을 합성하는 데 큰 도움이됩니다. 비록 그것이 이름이 제안하는 것보다 더 많은 것을 나타내는 것처럼 보이지만, 렌더링 시스템은 큰 부분이지만 그림의 일부이기 때문에.
프론트 엔드 컨트롤러 (index.php) Symfony2는 이제 Drupal의 중요한 부분입니다. 후자는 많은 Symfony 구성 요소를 사용합니다.이 기사의 가장 중요한 구성 요소는 HTTPKERNEL 및 HTTPFOUNDATION 구성 요소입니다. 이들은 함께 사용자 요청을 캡슐화하고 응용 프로그램에 전달한 다음 반환 된 콘텐츠를 일관되고 객체 지향적 인 방식으로 사용자에게 반환 할 책임이 있습니다.
httpkernelinterface (다른 컨텍스트에서도 들었을 수도 있음)는
request 객체를 수신하고 항상 응답 객체를 반환 하여이 모든 것을 함께 접착합니다. 매우 간단하지만 강력한 개념.
이 프로세스는 index.php 파일 내부에서 시작하여 요청 객체를 먼저 생성하고 httpkernel :: handle () 메소드로 전달합니다. 후자는 응답 객체를 반환 할 책임이 있습니다. 높은 수준에서 이는 Drupal 응용 프로그램과 Symfony 응용 프로그램 (또는 HTTPKERNEL 구성 요소를 사용하는 다른 응용 프로그램)에서 발생합니다.
httpkernel 및 이벤트
httpkernel은 모든 Symfony 기반 응용 프로그램의 핵심입니다. 우리가 볼 수 있듯이, hone () 메소드는 응답 준비에 많은 책임이 있으며 이벤트 중심 프로세스로이를 수행합니다. 이것은 응용 프로그램을 매우 유연하게 만들고, 무거운 작업은 항상 이러한 이벤트의 청취자에게 위임됩니다.
이전 차트를 보면이 워크 플로가 두 번째 열에 설명되어 있음을 알 수 있습니다.이 열은 기본적으로 Symfony와 Drupal의 측면에서 접착제를 나타냅니다.
kernel.request라는 첫 번째 이벤트로 시작합니다. 이 이벤트의 가입자는 다양한 작업을 처리합니다. 그러나 Drupal 8에서는 두 가지 매우 중요한 작업이 형식 협상 및 라우팅입니다. 첫 번째는 반환 해야하는 응답 유형을 결정하고 (HTML, JSON, 이미지, PDF 등), 두 번째는이 응답을 처리하는 코드를 결정합니다 (Routing.yml 파일의 경로에서 정의 된 _Controller 키 ). 그러나이 이벤트 워크 플로의 대부분의 단계와 마찬가지로 리스너가 응답 객체를 반환하면 프로세스가 대부분의 후속 단계 (전파 중지)를 건너 뛰고 Kernel.Response로 직접 이동합니다.
두 번째 이벤트는 kernel.controller입니다. 응용 프로그램에서 요청 처리를 담당하는 컨트롤러가 어떤 컨트롤러가 있는지 알 수 있습니다. 이 시점에서 청취자는 여전히 우선적 인 작업을 수행 할 수 있습니다. 이 단계 직후, 커널은 컨트롤러에 전달 된 매개 변수를 구문 분석 할 책임이 있습니다. Drupal에서 이러한 작업 중 하나는 요청에있는 ID (예 : 노드)를 기반으로 객체를로드하고 이러한 객체를 컨트롤러에 직접 제공하는 것입니다. 그런 다음 컨트롤러는 결국 해당 매개 변수로 호출됩니다.
컨트롤러는 어떤 종류의 응답을 반환 할 책임이 있습니다. 응답 객체를 반환하면 프로세스가 Kernel.Response 이벤트로 이동합니다. 후자의 청취자는 헤더 또는 컨텐츠 자체를 수정하는 등 객체에 대한 마지막 순간 수정을 수행 할 수 있습니다. 또한 핸들 () 메소드에서 가져온 후 프론트 엔드 컨트롤러는 응답 객체에서 send () 메소드를 사용하여 사용자에게 다시 보냅니다.
렌더링 된 배열에 대한 더 깊은 이해
컨트롤러가 응답 객체를 반환하지 않으면 커널은 마지막 이벤트를 트리거합니다. kernel.view. 가입자는 컨트롤러 결과를 실제 응답 객체로 변환 할 책임이 있습니다. 따라서 이는 해당 개체를 올바른 응답으로 변환하는 View Event Subscriber와 결합하는 한 컨트롤러에서 모든 유형의 객체를 반환 할 수 있음을 의미합니다.
그러나 예제에서 볼 수 있듯이 컨트롤러는 대부분의 시간을 렌더링 된 배열을 반환합니다. 이것은 일반적으로 페이지의 주요 내용을 나타냅니다 (Drupal 7의 페이지 콜백과 유사).
이를 처리하기 위해 Drupal 8에는이 배열을 올바른 응답 객체로 변환 할 책임이있는 MainContentViewScriber가 있습니다. 이전에 논의 된 형식 협상 단계에서 선택한 특정 MainContentrenderer를 사용하여이를 수행합니다. 이러한 렌더러 중 일부는 이미 사용할 수 있지만 사용되는 기본 렌더러는 Htmlrenderer입니다.
htmlrenderer
이것은 가장 일반적으로 사용되는 주요 콘텐츠 렌더러 유형이므로 페이지를 만드는 방법을 자세히 살펴 보겠습니다.
이 과정에서 멋진 것은 페이지 변형의 개념입니다. 이는 HTMLRENDERER가 기본 컨텐츠 렌더링 어레이를 래프팅하는 데 사용할 페이지 유형을 찾아야 할 이벤트를 파견한다는 것을 의미합니다. 기본적으로 블록 모듈이 활성화되지 않으면 SimplePageVariant가 사용됩니다. 이 경우 BlockPageVariant가 시작하여 주요 컨텐츠 주변의 영역에 블록을 배치 할 수 있습니다. 원한다면이 이벤트를 자신의 모듈로 구독하고 자신의 변형을 제공 할 수 있습니다.
이 모든 것은 htmlrenderer의 repay () 메소드에서 발생하며, #type = & gt를 제공합니다. 후자는 #type = & gt; 'Html'렌더링 배열로 래핑되며, 이는 렌더러 클래스를 사용하여 렌더링됩니다 (Drupal 7의 Drupal_render (). 생성 된 HTML 문자열이 응답 객체에 추가되어 프론트 엔드 컨트롤러로 반환됩니다.
이것은 프로세스에 대한 매우 높은 수준의 개요이지만 기본적으로 일어난 일입니다. 이제 응답 객체가 있습니다. 즉, 커널이 Kernel.Response 이벤트를 발송 할 수 있습니다. 그 후 프론트 엔드 컨트롤러는 응답을 사용자에게 직접 보내고 프로세스를 종료 할 수 있습니다.
결론
이 기사에서는 사용자 요청에서 서버 리턴으로의 응답을 추적하여 내부적으로 Drupal 8 (및 Symfony2)을 탐색했습니다. 우리는 Drupal 8이 HTTPKernel 및 HTTPFoundation Symfony2 구성 요소를 어떻게 활용하는지, 그리고 기본적으로 해당 구성 요소 위에 있는지 보았습니다. 또한, 우리는 그들 사이의 접착제가 어떻게 커널에 의해 디스패치 된 이벤트로 구성되는지 봅니다. Drupal은 모든 기능에 대해 가입합니다. 마지막으로, 렌더링 파이프 라인을 사용하여 HTML 페이지를 사용자에게 빌드하고 반환하는 방법을 보았습니다.
Drupal 8 응용 프로그램에서 무대 뒤에서 무슨 일이 일어나고 있는지 이해하면이 프로세스에 정확히 어디로 갈 수 있는지 알면서 훌륭한 응용 프로그램을 만들 수 있다고 생각합니다. 나는 당신 이이 기사에서 한 가지만 빼앗는다면, 그것은 유연성 라는 단어가되어야한다고 생각합니다. Drupal 8에서 필요한 것을 구축 할 수있는 유연성은 Drupal 7에서 무엇보다 훨씬 많기 때문입니다. 그것은 실제로 현대적이되었습니다.
Drupal 8의 내부 구조 (FAQ)에 대한 FAQS FAQS
Drupal 7과 Drupal 8의 주요 차이점은 무엇입니까?
Drupal 8은 Drupal 7에 비해 몇 가지 주요 변경 사항을 도입합니다. Twig라는 새로운 테마 엔진이있어 더 안전하고 유연합니다. Drupal 8은 또한 모바일 친화적이며 더 내장 된 필드를 포함합니다. 언어 관리 및 번역 지원이 향상된 다국어 사이트를 더 잘 지원합니다. 또한 Drupal 8은 Symfony 구성 요소의 광범위한 사용으로 인해 타사 플랫폼과 더 잘 통합됩니다.
Drupal 8 요청 및 응답을 처리하는 방법은 무엇입니까?
Drupal 8 Symfony HttpKernel 구성 요소를 사용하여 요청 및 응답을 처리합니다. 요청이 이루어지면 Drupal 8은 요청 객체를 생성하여 httpkernel로 전달합니다. 그런 다음 httpkernel은 라우팅 시스템을 사용하여 요청을 처리 해야하는 컨트롤러를 결정합니다. 컨트롤러는 요청을 처리하고 httpkernel이 클라이언트로 다시 전송하는 응답 객체를 반환합니다.
Drupal 8에서 라우팅 시스템의 역할은 무엇입니까?
Drupal 8의 라우팅 시스템은 URL을 특정 컨트롤러에 매핑 할 책임이 있습니다. 모듈에서 제공 한 라우팅 정의를 사용하여 주어진 요청을 처리 해야하는 컨트롤러를 결정합니다. 라우팅 시스템은 또한 동적 라우팅을 지원하며 시스템 상태에 따라 변경할 수 있습니다.
Drupal 8의 테마 시스템은 어떻게 작동합니까?
Drupal 8의 테마 시스템은 유연하고 안전한 템플릿 엔진 인 Twig를 사용합니다. Drupal 8의 주제는 .info.yml 파일 (주제에 대한 메타 데이터 제공)과 Twig 템플릿 파일 (HTML 출력 정의)으로 구성됩니다. 테마 시스템은 또한 템플릿 상속을 지원하므로 테마가 다른 테마 또는 모듈에서 템플릿을 확장하고 덮어 쓸 수 있습니다.
Drupal 8에서 사용자 정의 모듈을 어떻게 개발합니까?
Drupal 8에서 사용자 정의 모듈을 개발하려면 모듈에 대한 메타 데이터를 제공하기 위해 .info.yml 파일을 작성하고 모듈의 PHP 코드를 포함하는 .Module 파일이 포함됩니다. 모듈에는 또한 서비스를 정의하는 경로 및 서비스 파일을 정의하는 라우팅 파일과 같은 다른 파일이 포함될 수도 있습니다. Drupal 8은 객체 지향 프로그래밍 및 Symfony 구성 요소를 사용하여 재사용 가능하고 테스트 가능한 코드를보다 쉽게 작성할 수 있습니다.
웹 개발에 Drupal 8을 사용하면 어떤 이점이 있습니까?
Drupal 8은 웹 개발에 많은 이점을 제공합니다. Symfony 구성 요소를 사용하여보다 강력하고 유연하게 만듭니다. 상자에서 반응 형 디자인을 지원하므로 모바일 친화적 인 웹 사이트를보다 쉽게 만들 수 있습니다. Drupal 8은 또한 다국어 지원, 더 나은 SEO 기능 및보다 사용자 친화적 인 관리 인터페이스를 향상시킵니다.
Drupal 8 데이터베이스 상호 작용을 처리하는 방법은 무엇입니까?
Drupal 8은 데이터베이스 API를 사용하여 데이터베이스 상호 작용을 처리합니다. 데이터베이스 API는 SQL 위에 추상화 계층을 제공하여 개발자는 기본 데이터베이스 엔진의 세부 사항을 이해하지 않고도 데이터베이스 쿼리를 작성할 수 있습니다. 또한 동적 쿼리, 트랜잭션 및 스키마 관리를 지원합니다.
Drupal 8에서 이벤트 스케줄러의 역할은 무엇입니까?