4

젠드의 MVC 요청 라이프 사이클을 이해하기 위해 this을 읽었습니다. 하지만 컨트롤러의 predispatch 메서드를 사용하는 zend의 모든 경우를 생각할 수 없습니다. 컨트롤러의 동작 전에 실행하려는 코드의 init 메서드가 충분하지 않습니다.젠드 컨트롤러의 프리 디스패치 방법

정확히 컨트롤러의 미리 배포판에 있어야하며 init이 아니어야합니다.

예를 들려 줄 수 있습니까?

+2

내가 젠드 응용 프로그램을 작성한 이래로 오랜 시간이 걸렸습니다. (따라서 주석과 답변이 아닙니다.) 가장 먼저 떠오르는 것은 인증 도우미가 있으면 컨트롤러에 액세스 할 수있는 권한이 있습니다. – Corbin

답변

9

Zend_Controller_Action - Object Initialization 및 다음 섹션 Pre and Post Dispatch Hooks을 참조하십시오. 그들은 둘 모두에 대한 세부 사항과 Action Controller 자체에 대해 자세히 설명합니다.

init()은 컨트롤러 개체를 설정하고 모든 작업에 사용할 수있는 초기화 작업을 수행하는 데 더 유용합니다. 이 (가) preDispatch()보다 먼저 실행되기 때문에 을 사용하려면 init()으로 설정해야합니다. init()에서 전달하거나 리디렉션하는 것이 가능하지만 preDispatch()에서 수행하는 것이 가장 좋습니다. 컨트롤러 동작을 전달하기 전에 실행되기 때문입니다.

참고 : 수동에서

초기화의 사용() preDispatch 대()는 그들 사이의 차이는 (초기화 및 preDispatch) 란 무엇이며, 어떤 조치를 당신은 각 걸릴 것?

init() 메서드는 주로 생성자를 확장하기위한 것입니다. 일반적으로 생성자는 단순히 객체 을 설정하고 많은 로직을 수행하지 않아야합니다. 여기에는 컨트롤러에 사용 된 리소스 (모델, 구성 개체 등)를 초기화하거나 앞면 컨트롤러, 부트 스트랩 또는 레지스트리에서 검색 한 값을 할당하는 작업이 포함될 수 있습니다.

방법은 또한 객체 또는 환경 (예를 들어,보기, 액션 도우미 등) 상태를 설정하는 데 사용하지만 차 목적이 있는지 여부 요청 된 작업에 대한 결정을하게하는 것입니다 수 있습니다() preDispatch 이 발송되어야합니다. 그렇지 않은 경우 _forward() ~ 다른 작업을 수행하거나 예외를 throw해야합니다.

참고 :_forward() 의도 두 가지 방법 중 의 형식화이다 초기화()에서 실행될 때 실제로 제대로 작동하지 않습니다. 같은 모든 행동의 레이아웃을 설정

public function preDispatch() { 

     $this->_helper->layout->setLayout('admin'); 
    } 

    /** 
    *initiaize the flashmessenger and assign the _session property 
    */ 
    public function init() { 

     if ($this->_helper->FlashMessenger->hasMessages()) { 
      $this->view->messages = $this->_helper->FlashMessenger->getMessages(); 
     } 
     //set the session namespace to property for easier access 
     $this->_session = new Zend_Session_Namespace('location'); 

    } 

내가 preDispatch()를 사용합니다 :

+0

덕분에 많은 @ drew010 –

2

여기 drew010의 대답은 내가 preDispatch()와 INT()를 사용하는 방법의 예입니다 연장 기본 레이아웃이 아니며 init()에서 플래시 메신저를 초기화하고이 컨트롤러의 세션 네임 스페이스를 설정하고 세션을 속성으로 초기화합니다.

1

preDispatch() 대신 init()을 사용하여 많은 리소스를 낭비 할 수있는 곳이 있습니다. 컨트롤러 플러그인의 preDispatch() 메소드를 사용하여 액세스 제어를 수행하면 호출 시퀀스는 YourController :: init() YourAccessPlugin :: preDispatch(), YourController :: preDispatch(), YourController :: whateverAction. 즉, init()에서 무거운 작업을 수행하면 승인되지 않은 사용자 을 트리거 할 수 있습니다. 예를 들어 init()에서 새 세션 네임 스페이스를 시작하면 무작위 검색 봇으로 인해 빈 세션으로 세션 데이터베이스가 어지럽게됩니다. 그래서 init에있는 아주 기본적인 간단한 것들을 고수하고, 모든 리소스를 수정하거나 수정하지 말고, 데이터베이스 액세스를 피하십시오.

관련 문제