Я написал простой помощник вида URL, который расширяет Zend\View\Helper\Url
и прикрепили его к ViewHelperManager
:Расширение Zend View Helper Url в Zend Framework 2
MyNamespace\View\Helper\Url
namespace MyNamespace\View\Helper;
use Zend\View\Helper\Url as ZendUrl;
class Url extends ZendUrl {
public function __invoke($name = null, array $params = array(), $options = array(), $reuseMatchedParams = false) {
$link = parent::__invoke($name, $params, $options, $reuseMatchedParams);
...
return $link;
}
}
Application\Module
namespace Application;
use ...
class Module {
public function onBootstrap(MvcEvent $mvcEvent) {
$application = $mvcEvent->getApplication();
$serviceManager = $application->getServiceManager();
$viewHelperManager = $serviceManager->get('ViewHelperManager');
$viewHelperManager->setInvokableClass('url', 'MyNamespace\View\Helper\Url');
...
}
}
Теперь приложение выдает исключение:
Fatal error: Uncaught exception 'Zend\View\Exception\RuntimeException' with message 'No RouteStackInterface instance provided' in /var/www/foo/bar/vendor/zendframework/zendframework/library/Zend/View/Helper/Url.php on line 76
Zend\View\Exception\RuntimeException: No RouteStackInterface instance provided in /var/www/foo/bar/vendor/zendframework/zendframework/library/Zend/View/Helper/Url.php on line 76
Я отлажена как Url
классов. Wenn MyNamespace\View\Helper\Url
, метод Zend\View\Helper\Url#setRouter(...)
не вызывается и маршрутизатор не установлен. Не поймите почему ...
Как заставить его работать?
Возможно, это поможет: https://github.com/zendframework/zf2/blob/master/library/Zend/Mvc/Service/ViewHelperManagerFactory.php#L63-L78 –
Спасибо! Да, я думаю, это помогает понять проблему. Класс помощника просмотра URL-адресов жестко закодирован ([строка 64] (https://github.com/zendframework/zf2/blob/master/library/Zend/Mvc/Service/ViewHelperManagerFactory.php#L64)). Это означает для меня, что помощник просмотра URL не может быть расширен без перезаписи 'Zend \ Mvc \ Service \ ViewHelperManagerFactory # createService (...)'. Правильно? – automatix
Ну, вы можете просто создать свою собственную фабрику и ввести компоненты. –