Zend 2 View Helper - 使用Abstract Helper渲染另一个帮助程序内容

时间:2014-01-08 10:42:14

标签: php zend-framework zend-framework2 view-helpers

我已经实现了一个名为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) */
}

如果这不是实施我需要的最佳方法,我很乐意接受任何其他建议。

1 个答案:

答案 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;
    }
}