ZendMvcMvcEvent는 ZendEventManagerEvent에서 상속되며 ZendMvcApplication::bootstrap()이 실행될 때 트리거됩니다. 컨트롤러가 ZendMvcInjectApplicationEventInterface를 구현하는 경우 MvcEvent가 이러한 컨트롤러에 주입됩니다.
MvcEvent는 Application, Request, Response, Router, RouterMatch, Result(일반적으로 컨트롤러 디스패치 결과), ViewModel(일반적으로 뷰 모델 레이아웃 표시) 개체에 대한 getter 및 규칙을 추가합니다. 애플리케이션, 요청, 응답, 라우터 및 ViewModel은 모두 부트스트랩 이벤트 프로세스 중에 주입됩니다. 다음 경로 이벤트는 라우팅 결과를 캡슐화하기 위해 RouteMatch 객체에 주입됩니다. RouteMatch 객체는 MVC 전체에서 사용되므로 일반적으로 RouteMatch를 통해 Route, Request 및 Response 객체를 얻습니다.
MvcEvent는 다음 메서드도 정의합니다.
setApplication(<span style="color: #800080;">$application</span><span style="color: #000000;">) getApplication() setRequest(</span><span style="color: #800080;">$request</span><span style="color: #000000;">) getRequest() setResponse(</span><span style="color: #800080;">$reponse</span><span style="color: #000000;">) getResponse() setRouter(</span><span style="color: #800080;">$router</span><span style="color: #000000;">) getRouter() setRouteMatch(</span><span style="color: #800080;">$routeMatch</span><span style="color: #000000;">) getRouteMatch() setResult() getResult() setViewModel(</span><span style="color: #800080;">$viewModel</span><span style="color: #000000;">) getViewModel() isError() setError() getError() getController() setController(</span><span style="color: #800080;">$name</span><span style="color: #000000;">) getControllerClass() setControllerClass(</span><span style="color: #800080;">$class</span>)
이벤트 발생 순서:
Name | Constant | Description |
bootstrap | MvcEvent::EVENT_BOOTSTRAP | 通过创建ViewManager来引导application |
route | MvcEvent::EVENT_ROUTE | 执行路由(或者路由相关的行为) |
dispatch | MvcEvent::EVENT_DISPATCH | 将匹配到的路由调度给相应的控制器/行为 |
dispatch.error | MvcEvent::EVENT_DISPATCH_ERROR | 当调度过程中发生错误时会被触发 |
render | MvcEvent::EVENT_RENDER | 准备数据并将渲染任务委托给视图层 |
render.error | MvcEvent::EVENT_RENDER_ERROR | render过程错误发生时触发 |
finish | MvcEvent::EVENT_FINISH | 一旦所有的事情完成后,本事件触发完成相应的任务 |
자세한 소개:
MvcEvent::EVENT_BOOTSTRAP("부트스트랩")
리스너: ZendMvcViewHttpViewManager, onBootstrap 메서드가 호출됩니다.
기능: 뷰 레이어를 준비합니다(즉, ZendMvcViewHttpViewManager 인스턴스화).
트리거 방법: ZendMvcApplication bootstrap() 방법.
MvcEvent::EVENT_ROUTE("경로")
리스너 1: ZendMvcModuleRouteListener::onRoute
함수: 는 주로 경로 일치에 포함된 매개변수 키가 MODULE_NAMESPACE 상수
와 일치하지 않도록 방지하기 위해 컨트롤러 이름 앞에 모듈 네임스페이스를 추가해야 하는지 여부를 결정합니다.리스너 2: ZendMvcRouteListener::onRoute MvcEvent::EVENT_DISPATCH_ERROR와 일치하는 경로가 없으면 트리거됩니다.
기능: 요청을 라우터에 일치시키고 RouteMatch 객체를 반환합니다.
트리거 방법: ZendMvcApplication::run
기능: 라우팅 과정에서 오류가 발생하면 짧은 루프 콜백을 사용하여 이벤트의 지속적인 전파를 중지합니다.
MvcEvent::EVENT_DISPATCH("디스패치")
리스너는 콘솔 환경에 한정되는 리스너와 HTTP 환경에 한정되는 리스너로 구분되며, 모든 환경에 적용 가능한 리스너가 있습니다. 이 기사에서는 CONSOLE 환경을 소개하지 않습니다. 콘솔 환경의 경우 공식 문서를 확인하실 수 있습니다.
ZendMvcViewHttpCreateViewModelListener 클래스에는 이 이벤트의 리스너로 사용되는 두 가지 함수가 있습니다.
1. createViewModelFromArray(컨트롤러 작업이 연관 배열을 반환하는 경우 리스너는 배열을 ViewModel 객체로 변환합니다.
2. createViewModelFromNull(컨트롤러가 null 값을 반환하는 경우 이 메서드는 이를 ViewModel 객체로 변환합니다)
ZendMvcViewHttpRouteNotFoundStrategy::prepareNotFoundViewModel 클래스가 404ViewModel을 생성하고 반환합니다
클래스 ZendMvcViewHttpInjectTemplateListener::injectTemplate 뷰 모델에 템플릿을 삽입합니다. 템플릿 이름은 경로(또는 컨트롤러의 작업)와 일치하는 컨트롤러 이름에서 상속됩니다.
클래스 ZendMvcViewHttpInjectViewModelListener::injectViewModel ViewModel을 삽입하고 MvcEvent 객체에 추가합니다. 두 가지 상황이 있습니다. a) 뷰 모델을 포함하여 하위 개체로 추가됩니다. b) 결과가 종료될 수 있는 경우 기본 상황을 교체합니다
ZendMvcMiddlewareListener::onDispatch 클래스는 MvcEvent::EVENT_DISPATCH_ERROR를 트리거하여 서비스 관리자에서 일치하는 PSR-7 미들웨어를 로드하고 디스패치합니다.
ZendMvcDispatchListener::onDispatch 클래스는 위와 동일한 효과를 갖는 MvcEvent::EVENT_DISPATCH_ERROR를 트리거합니다.
클래스 ZendMvcControllerAbstractController::onDispatch 이 메서드는 추상 클래스입니다.
트리거 방법:
ZendMvcApplication::run은 짧은 루프 콜백을 사용하여 이벤트 전파를 종료합니다. (라우팅 중 오류가 발생한 경우)
ZendMvcControllerAbstractController::dispatch는 리스너가 Response 객체를 반환하는 경우 이벤트 전파를 종료합니다. AbstractController가 이 이벤트를 수신할 때마다 onDispatch 메서드가 트리거될 때 호출됩니다.
MvcEvent::EVENT_RENDER("렌더링")
청취자:
ZendMvcViewConsoleDefaultRenderingStrategy::render는 뷰를 렌더링하는 데 사용됩니다
ZendMvcViewHttpDefaultRenderingStrategy::render도 뷰를 렌더링합니다. 위 환경과의 차이점에 유의하세요
트리거 방법:
ZendMvcApplication::competeRequest 이 이벤트는 MvcEvent::FINISH가 트리거되기 전에 트리거됩니다.
MvcEvent::EVENT_FINISH("완료")
청취자:
ZendMvcSendResponseListener::sendResponse는 SendResponseEvent를 트리거하여 응답을 준비합니다.
트리거 방법:
ZendMvcApplication::run 이 이벤트는 MvcEvent::ROUTE 또는 MvcEvent::DISPATCH 이벤트가 올바른 ResponseInterface를 반환하면 트리거됩니다.
ZendMvcApplication::completeRequest는 MvcEvent::RENDER(즉, 현재 뷰가 렌더링됨) 후에 트리거됩니다.
SendResponse 이벤트 소개
ZendMvcResponseSenderSendResponseEvent는 다음 메소드를 정의합니다.
setResponse($response)
getResponse()
setContentSent()
콘텐츠보냄()
setHeadersSent()
헤더보냄()
이러한 메소드는 응답 헤더와 응답 내용을 설정하는 데 사용됩니다.
청취자:
ZendMvcSendResponseListenerPhpEnvironmentResponseSender::__invoke 사용 환경 HTTP
ZendMvcSendResponseListenerConsoleResponseSender::__invoke는 콘솔 환경을 사용합니다.
ZendMvcSendResponseListenerSimpleStreamResponseSender::__invoke
MvcEvent::이 이벤트는 FINISH 이벤트가 발생한 후 실행됩니다.