我已经实现了一个名为contentByKey的Zend View Helper,它在我的CMS引擎中呈现了一些HTML。我想实现它,以便这个View Helper是我的标记中调用的唯一帮助器(传递一个键来查找DB中的内容)。当它尝试构建HTML内容时,它需要能够在View Helper类中调度另一个View Helpers渲染。我的类实现了AbstractHelper。见下文:
class ContentByKey extends AbstractHelper{
public function __invoke($key){
/* 1. Fetch content from DB and check type */
/* 2. Content type = "foo";*/
/* 3. NEEDED LOGIC - Invoke fooHelper here (needs to process additional logic before rendering so simply rendering a different script isnt enough) */
}
如果这不是实施我需要的最佳方法,我很乐意接受任何其他建议。
答案 0 :(得分:4)
视图助手由视图助手插件管理器(或Zend\View\HelperPluginManager
)构成。此管理器在每个视图助手中注入视图渲染器对象(请参阅GitHub上的getView()
/ setView()
)。它使您可以调用其他助手:
<?php
use Zend\View\Helper\AbstractHelper;
class ContentByKey extends AbstractHelper
{
public function __invoke($key)
{
// fetch data from database
// $text = ...
// example: translate this text via the translator
$translated = $this->getView()->translate($text);
return $translated;
}
}
这是做这些事情的常用方法,所以这样做是可以的。或者,您可以在自己的帮助器中注入视图助手。这个例子有点倾斜,因为你会注入一个Translator对象而不是translate视图帮助器,但无论如何:
<?php
use Zend\View\Helper\AbstractHelper;
use Zend\I18n\View\Helper\Translate as TranslateHelper;
class ContentByKey extends AbstractHelper
{
protected $translate;
public function __construct(TranslateHelper $translate)
{
$this->translate = $translate;
}
public function __invoke($key)
{
// fetch data from database
// $text = ...
// example: translate this text via the translator
$translated = $this->translate($text);
return $translated;
}
}
您必须以这种方式注入帮助程序,因此您需要为帮助程序创建工厂:
<?php
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use MyModule\View\Helper\ContentByKey;
class ContentByKeyFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
$viewManager = $serviceLocator->get('ViewHelperManager');
$translate = $viewManager->get('translate');
$helper = new ContentByKey($translate);
return $helper;
}
}