Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zend framework2 在Zend Framework 2中扩展Zend\View\Helper\Url_Zend Framework2_Urlhelper_Viewhelper - Fatal编程技术网

Zend framework2 在Zend Framework 2中扩展Zend\View\Helper\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

我编写了一个简单的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, 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
类。Wenn
MyNamespace\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视图帮助程序。是吗?你可以创建自己的工厂,然后注入组件。