zf2 Uncaught исключение времени выполнения "Не предоставлен экземпляр RouteMatch" с маршрутом i18n

У меня есть проблема, так как я включаю lang в параметры маршрута для Zf2. Мои действительные маршруты в порядке, и это работает. Но когда я даю неправильный маршрут, возникает это исключение, и оно не перехватывается zf2:

Fatal error: Uncaught exception 'Zend\View\Exception\RuntimeException' with message 'No RouteMatch instance provided'[path]\vendor\zendframework\zendframework\library\Zend\View\Helper\Url.php on line 64

Это пример кода, который я подозреваю, что он неверен в случае неправильного маршрута:

<ul class="dropdown-menu">
                            <li><a href="<?= $this->url($this->route, array('lang' => 'fr'));?>">
                                <span class="flag fr"></span> Français
                            </a></li>
                            <li><a href="<?=$this->url($this->route, array('lang' => 'en'));?>">
                                <span class="flag gb"></span> English
                            </a></li>
                        </ul>

Это имеет смысл, этот-> маршрут неверен, если указан неправильный путь, что мне нужно изменить, чтобы исправить это, пожалуйста?

2 ответа

В вашем AnyModule\ Module.php напишите строки ниже

public function onBootstrap(MvcEvent $e)
{
    $application         = $e->getApplication();
    $eventManager        = $application->getEventManager();

    /**
     * Zf2 View Url helper bug fix
     * The problem is Url helper always requires RouteMatch
     * if you used null in route name or set reuse matches to true
     * even in 404 error but 404 itself means that there is not any route match ;)
     */
    $eventManager->attach(
        \Zend\Mvc\MvcEvent::EVENT_DISPATCH_ERROR, 
        function ($e) {
            $application    = $e->getApplication();
            $serviceLocator = $application->getServiceManager();
            $match          = $application->getMvcEvent()->getRouteMatch();

            if (null === $match) {
                $params     = [
                    '__NAMESPACE__' => 'Application\Controller',
                    'controller'    => 'Index',
                    'action'        => 'not-found',
                    // Here you can add common params for your application routes
                ];
                $routeMatch = new \Zend\Mvc\Router\RouteMatch($params);

                $routeMatch->setMatchedRouteName('home');
                $application->getMvcEvent()->setRouteMatch(
                    $routeMatch
                );
            }
        }
    );
}

Если вы посмотрите на строку 62 Zend\View\Helper\Url помощник, понятно, что исключение будет возбуждено только если вы передадите NULL в качестве $name аргумент.

// ...Zend\View\Helper\Url.php
if ($name === null) {
    if ($this->routeMatch === null) {
        throw new Exception\RuntimeException('No RouteMatch instance provided');
    } 

Поэтому вы должны убедиться, что $this->route Переменная view правильно установлена перед использованием.

Другие вопросы по тегам