Zend framework2 在Zend Framework 2中扩展Zend\View\Helper\Url
我编写了一个简单的url视图帮助程序,它扩展了Zend framework2 在Zend Framework 2中扩展Zend\View\Helper\Url,zend-framework2,urlhelper,viewhelper,Zend Framework2,Urlhelper,Viewhelper,我编写了一个简单的url视图帮助程序,它扩展了Zend\view\helper\url,并将其附加到ViewHelperManager: MyNamespace\View\Helper\Url namespace MyNamespace\View\Helper; use Zend\View\Helper\Url as ZendUrl; class Url extends ZendUrl { public function __invoke($name = null, arr
Zend\view\helper\url
,并将其附加到ViewHelperManager
:
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;
}
}
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');
...
}
}
应用程序\模块
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;
}
}
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');
...
}
}
现在,应用程序抛出一个异常:
致命错误:第76行的/var/www/foo/bar/vendor/zendframework/zendframework/library/Zend/View/Helper/Url.php中出现未捕获异常“Zend\View\exception\RuntimeException”,并显示消息“未提供RouteStackInterface实例”
Zend\View\Exception\RuntimeException:76行的/var/www/foo/bar/vendor/zendframework/zendframework/library/Zend/View/Helper/Url.php中未提供RouteStackInterface实例
我调试了两个Url
类。WennMyNamespace\View\Helper\Url
被使用,方法Zend\View\Helper\Url\setRouter(…)
未被调用,路由器也未设置。不明白为什么
如何让它工作?没有测试这个,所以我不知道它是否工作,我只是猜测: 替换:
$viewHelperManager->setInvokableClass('url','MyNamespace\View\Helper\url');
与:
$viewHelperManager->setFactory('url',函数($sm)使用($serviceLocator){
$helper=new\MyNamespace\View\helper\Url;
$router=Console::isConsole()?'HttpRouter':'router';
$helper->setRouter($serviceLocator->get($router));
$match=$serviceLocator->get('应用程序')
->getMvcEvent()
->getRouteMatch();
if($match instanceof RouteMatch){
$helper->setRouteMatch($match);
}
返回$helper;
});
Aydin的解决方案对我有效,我将代码或多或少地原封不动地放在module.php的getViewHelperConfig中
public function getViewHelperConfig()
{
return array(
'invokables' => array(
.....
),
'factories' => array(
'modalurl' => function ($helperPluginManager) {
$serviceLocator = $helperPluginManager->getServiceLocator();
$view_helper = new \Application\View\Helper\ModalUrl();
$router = \Zend\Console\Console::isConsole() ? 'HttpRouter' : 'Router';
$view_helper->setRouter($serviceLocator->get($router));
$match = $serviceLocator->get('application')
->getMvcEvent()
->getRouteMatch();
if ($match instanceof RouteMatch) {
$view_helper->setRouteMatch($match);
}
return $view_helper;
}
),
);
}
您也可以使用初始值设定项
'view_helpers' => array(
'invokables' => array(
'MyUrl' => 'MyModule\View\Helper\MyUrl'
),
'initializers' => array(
function ($instance, $sm) {
if ($instance instanceof \Zend\View\Helper\Url) {
$serviceLocator = $sm->getServiceLocator();
$router = \Zend\Console\Console::isConsole() ? 'HttpRouter' : 'Router';
$instance->setRouter($serviceLocator->get($router));
$match = $serviceLocator->get('application')
->getMvcEvent()
->getRouteMatch();
if ($match instanceof RouteMatch) {
$instance->setRouteMatch($match);
}
}
}
)
)
您可以根据需要扩展\Zend\View\Helper\Url
namespace MyModule\View\Helper;
use Zend\View\Helper\Url as ZendUrl;
class MyUrl extends ZendUrl {
public function __invoke() {
return parent::__invoke('MyRoute');
}
}
虽然这个问题已经很老了,但我认为在这里添加一个基于配置的覆盖还是值得的,可以使用在
HelperPluginManager
中注册的工厂:
在module.config.php
中:
'view_helpers' => array(
'factories'=> array(
'url' => 'Application\View\Helper\UrlFactory',
)
),
以及view helper插件工厂本身:
<?php
namespace Application\View\Helper;
use Zend\Console\Console;
use Zend\Mvc\Router\RouteMatch;
use Zend\Mvc\Router\RouteStackInterface;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\View\Helper\Url as BaseUrlHelper;
use Zend\View\HelperPluginManager;
class UrlFactory implements FactoryInterface
{
/**
* Create service
*
* @param ServiceLocatorInterface $helperPluginManager
* @return mixed
*/
public function createService(ServiceLocatorInterface $helperPluginManager)
{
/**
* @var $helperPluginManager HelperPluginManager
* @var $router RouteStackInterface
*/
$serviceLocator = $helperPluginManager->getServiceLocator();
$helper = new Url();
$router = Console::isConsole() ? 'HttpRouter' : 'Router';
$router = $serviceLocator->get($router);
$helper->setRouter($router);
$match = $serviceLocator->get('application')
->getMvcEvent()
->getRouteMatch()
;
if ($match instanceof RouteMatch) {
$helper->setRouteMatch($match);
}
return $helper;
}
}
也许这会有帮助:谢谢!是的,我认为,这有助于理解问题。URL视图帮助器的类是硬编码的()。这对我来说意味着,如果不重写Zend\Mvc\Service\ViewHelperManagerFactory\createService(…)
,就无法扩展URL视图帮助程序。是吗?你可以创建自己的工厂,然后注入组件。