如何使用自定义帮助程序覆盖本机zf2视图助手

时间:2014-09-05 08:20:39

标签: model-view-controller view zend-framework2

我想创建一个自定义的basepath帮助程序来替换原来的zf2 basepath视图帮助程序。

因此,如果我调用$this->basepath,它将使用我的自定义基本路径而不是原始路径。我不确定是否可以这样做。我希望我的自定义basepath也扩展了原始的basepath类。

我找到了一些关于如何创建自定义帮助程序以及如何在module.php或module.config.php中注册它们的答案

但我无法找到关于如何覆盖原始助手的任何类似问题!

1 个答案:

答案 0 :(得分:0)

basepath视图助手的工厂定义在HelperPluginManager(on line 45)中声明为硬编码的invokable,但是这个定义也在ViewHelperManagerFactory(line 80 to 93)中重写,因为BasePath视图助手需要<来自ServiceLocator的strong> Request 实例:

$plugins->setFactory('basepath', function () use ($serviceLocator) {
    // ...
})

我强烈建议使用不同的名称(例如 MyBasePath )扩展内置的basepath帮助程序,而不是尝试覆盖现有的名称。覆盖该本机助手可能会在以后产生一些意想不到的麻烦(想想使用该助手工作的第三方模块)。

对于你的问题;是的,这是可能的。

创建Application\View\Helper\BasePath.php辅助类,如下所示:

namespace Application\View\Helper;

use Zend\View\Helper\BasePath as BaseBasePath; // This is not a typo

/**
 * Custom basepath helper
 */
class BasePath extends BaseBasePath
{
    /**
     * Returns site's base path, or file with base path prepended.
     */
    public function __invoke($file = null)
    {
        var_dump('This is custom helper');
    }
}

并覆盖Module.php文件的onBootstrap()方法中的工厂,如下所示:

namespace Application;

use Zend\Mvc\MvcEvent;
use Application\View\Helper\BasePath; // Your basepath helper.
use Zend\View\HelperPluginManager;

class Module
{
    /**
     * On bootstrap for application module.
     *
     * @param  MvcEvent $event
     * @return void
     */
    public function onBootstrap(MvcEvent $event)
    {
        $services = $event->getApplication()->getServiceManager();

        // The magic happens here
        $services->get('ViewHelperManager')->setFactory('basepath', function (HelperPluginManager $manager) {
            $helper = new BasePath();
            // Here you can do whatever you want with the instance before returning
            return $helper;
        });
    }
}

现在您可以尝试这样的任何视图:

echo $this->basePath('Bar');

这不是一个完美的解决方案,但应该可行。