【问题标题】:Zend 2 View Helper - Using Abstract Helper to render another helper contentZend 2 View Helper - 使用 Abstract Helper 呈现另一个帮助内容
【发布时间】:2014-01-08 10:42:13
【问题描述】:

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

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

【问题讨论】:

  • 你想在__invoke中调用另一个视图助手吗?
  • 是的,并且呈现视图助手内容而不是 ContentByKey 的
  • 将你需要的ViewHelper注入到你自己的ViewHelper中
  • 你能举个例子@Sam吗?

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


【解决方案1】:

视图助手由视图助手插件管理器(或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;
    }
}

这是做这些事情的一种很常见的方式,所以这样做是可以的。或者,您可以将视图助手注入您自己的助手中。该示例有点倾斜,因为您将注入一个翻译器对象而不是翻译视图帮助器,但无论如何:

<?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;
    }
}

【讨论】:

  • 谢谢朱里安,这是完美的:)
  • Jurian,我意识到我需要动态执行帮助程序(事先不知道将返回哪个帮助程序)。你能提供一种方法来做到这一点吗?在您的示例中,您使用 Translator 作为固定助手,但我的助手根据从数据库中提取的内容而有所不同(类型字段具有助手的名称)。
  • 我看到有一个插件代理 - $view->plugin('helperName') 只要你的助手实现 __invoke 方法就可以使用它。也许你有更好的解决方案?
  • @Blyde __invoke($helpername, $morevars...) 然后在 $this-&gt;$helpername($text) 内部应该可以工作,如果我现在没记错的话
  • @Sam 谢谢你,我也玩了一遍,最后也得到了上面的结果:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多