0

У меня есть много модулей в приложении Zend. Будут ошибки и исключения в каждом модуле, не так ли? Поэтому я создаю страницу ошибки в модуле приложения, и она работает.Используйте тот же обработчик ошибок в разных модулях в Zend Framework 2

Однако в других модулях они не могут использовать страницу с ошибкой. Итак, что мне делать, чтобы повторно использовать страницу с ошибкой?

Вот module.config.php файла в модуле Application:

return array(
    ..., 
    'controllers' => array(
     'invokables' => array(
      'Application\Controller\Index' => 'Application\Controller\IndexController' 
     ), 
    ), 
    'view_manager' => array(
     'display_not_found_reason' => true, 
     'display_exceptions'  => true, 
     'doctype'     => 'HTML5', 
     'not_found_template'  => 'error/404', 
     'exception_template'  => 'error/index', 
     'template_map' => array(
      'layout/layout'   => __DIR__ . '/../view/layout/layout.phtml', 
      'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', 
      'error/404'    => __DIR__ . '/../view/error/404.phtml', 
      'error/index'    => __DIR__ . '/../view/error/index.phtml', 
     ), 
     'template_path_stack' => array(
      __DIR__ . '/../view', 
     ), 
    ), 
); 

Проблема возникает, когда я возвращаю ответ HTTP 404 вручную с помощью следующего кода:

if ($information == null) { 
    $response = $this->getResponse(); 
    $response->setStatusCode(404); 
    return $response; 
} 

Однако, когда я получить доступ к нелегальным ресурсам, такие как http://example.com/something-do-not-exist. Я доберусь до страницы ошибки 404, за исключением The requested URL could not be matched by routing.

ответ

0

Конфигурация вы перечисленное определяется в модуле приложения, однако это не специально для этого модуля.

Это связано с тем, что во время загрузки загрузочный лоток каждый module.config.php равен merged together into one configuration array (using array_merge_recursive()). Это конфигурация, которую вы можете получить с помощью $serviceManager->get('Config');

Таким образом, конфигурация является глобальной для приложения, и все ошибки (исключения) должны использовать один и тот же шаблон ошибки (application/view/error/index.phtml).

Важно помнить, что порядок загрузки модулей важен; так как загрузка модулей по-прежнему будет всегда перезаписывать существующую конфигурацию.

+0

Вы имеете в виду, что я должен добавить '$ serviceManager-> get ('Config');' в Module.php в других модулях? –

+0

@HowardXie Нет, вот как вы получаете конфигурацию объединенного приложения. Если вам нужен тот же ** шаблон ошибки во всех модулях, вам больше нечего делать - код, который вы опубликовали, должен работать для всех модулей. – AlexP

+0

Конечно нет. Если я использую приведенную выше конфигурацию, я должен создать страницы ошибок в каждом модуле. Поскольку относительный путь '/../ view/error/404.phtml' не существует в других модулях. –

0

Почему другие модули не могут использовать страницу с ошибкой?

Во всяком случае, есть более чем один способ сделать это;)

Вы можете, например, определить несколько имен в template_map для каждой страницы ошибок вы хотите.

0

я решить эту проблему с помощью следующего кода:

if ($information == null) { 
    return $this->notFoundAction(); 
} 

И это будет перенаправить вас на глобальной странице ошибки.