젠드의 MVC 요청 라이프 사이클을 이해하기 위해 this을 읽었습니다. 하지만 컨트롤러의 predispatch 메서드를 사용하는 zend의 모든 경우를 생각할 수 없습니다. 컨트롤러의 동작 전에 실행하려는 코드의 init 메서드가 충분하지 않습니다.젠드 컨트롤러의 프리 디스패치 방법
정확히 컨트롤러의 미리 배포판에 있어야하며 init이 아니어야합니다.
예를 들려 줄 수 있습니까?
젠드의 MVC 요청 라이프 사이클을 이해하기 위해 this을 읽었습니다. 하지만 컨트롤러의 predispatch 메서드를 사용하는 zend의 모든 경우를 생각할 수 없습니다. 컨트롤러의 동작 전에 실행하려는 코드의 init 메서드가 충분하지 않습니다.젠드 컨트롤러의 프리 디스패치 방법
정확히 컨트롤러의 미리 배포판에 있어야하며 init이 아니어야합니다.
예를 들려 줄 수 있습니까?
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()를 사용합니다 :
덕분에 많은 @ drew010 –
여기 drew010의 대답은 내가 preDispatch()와 INT()를 사용하는 방법의 예입니다 연장 기본 레이아웃이 아니며 init()에서 플래시 메신저를 초기화하고이 컨트롤러의 세션 네임 스페이스를 설정하고 세션을 속성으로 초기화합니다.
preDispatch() 대신 init()을 사용하여 많은 리소스를 낭비 할 수있는 곳이 있습니다. 컨트롤러 플러그인의 preDispatch() 메소드를 사용하여 액세스 제어를 수행하면 호출 시퀀스는 YourController :: init() YourAccessPlugin :: preDispatch(), YourController :: preDispatch(), YourController :: whateverAction. 즉, init()에서 무거운 작업을 수행하면 승인되지 않은 사용자 이을 트리거 할 수 있습니다. 예를 들어 init()에서 새 세션 네임 스페이스를 시작하면 무작위 검색 봇으로 인해 빈 세션으로 세션 데이터베이스가 어지럽게됩니다. 그래서 init에있는 아주 기본적인 간단한 것들을 고수하고, 모든 리소스를 수정하거나 수정하지 말고, 데이터베이스 액세스를 피하십시오.
내가 젠드 응용 프로그램을 작성한 이래로 오랜 시간이 걸렸습니다. (따라서 주석과 답변이 아닙니다.) 가장 먼저 떠오르는 것은 인증 도우미가 있으면 컨트롤러에 액세스 할 수있는 권한이 있습니다. – Corbin