我想创建一个自定义的basepath帮助程序来替换原来的zf2 basepath视图帮助程序。
因此,如果我调用$this->basepath
,它将使用我的自定义基本路径而不是原始路径。我不确定是否可以这样做。我希望我的自定义basepath也扩展了原始的basepath类。
我找到了一些关于如何创建自定义帮助程序以及如何在module.php或module.config.php中注册它们的答案
但我无法找到关于如何覆盖原始助手的任何类似问题!
答案 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');
这不是一个完美的解决方案,但应该可行。