我从谷歌来了这个问题,我的问题有点困难。由于绝对不可预测的 url 可能会引发 404 错误,因此您无法确定是否在某些控制器中捕获了它。控制器 - 捕捉 404 错误为时已晚。
在我的情况下,解决方案是捕获EVENT_DISPATCH_ERROR
并完全重建viewModel
. Cavern 是那个布局 - 是一个 root viewModel
,默认情况下附加到布局中的内容是另一个viewModel
(子)。这些点在官方文档中描述得不是很清楚。
这是它在您的 中的样子Module.php
:
public function onBootstrap(MvcEvent $event)
{
$app = $event->getParam( 'application' );
$eventManager = $app->getEventManager();
/** attach Front layout for 404 errors */
$eventManager->attach( MvcEvent::EVENT_DISPATCH_ERROR, function( MvcEvent $event ){
/** here you can retrieve anything from your serviceManager */
$serviceManager = $event->getApplication()->getServiceManager();
$someVar = $serviceManager->get( 'Some\Factory' )->getSomeValue();
/** here you redefine layout used to publish an error */
$layout = $serviceManager->get( 'viewManager' )->getViewModel();
$layout->setTemplate( 'layout/start' );
/** here you redefine template used to the error exactly and pass custom variable into ViewModel */
$viewModel = $event->getResult();
$viewModel->setVariables( array( 'someVar' => $someVar ) )
->setTemplate( 'error/404' );
});
}