【问题标题】:Sharing Zend Helpers (view or action) Between Modules在模块之间共享 Zend Helpers(视图或操作)
【发布时间】:2010-09-19 19:08:23
【问题描述】:

假设您试图让自己尽可能接近 Zend Framework 的宇宙视图,那么应该如何将一个模块中的视图和操作助手与另一个模块共享?

假设我有两个模块。模块“A”有一个名为 Output 的视图助手。

class Modulea_Zend_View_Helper_Ouput extends Zend_View_Helper_Abstract
{
    function output($var)
    {
        echo strip_tags($var);
        return true;
    }
}

如果我尝试从模块“B”的视图中使用此帮助器

File: moduleb/views/scripts/index/index.phtml

<?php $this->output($somevar); ?>

我得到一个例外

在注册表中找不到名为“输出”的插件

什么是“正确的”是使用来自模块 B 的视图助手输出。

【问题讨论】:

  • 那么,您在模块 A 中有一个实际上不是特定于模块的视图助手?
  • 杰森,没错。我们经常发现/意识到为特定模块构建的助手最终在另一个模块中有用。这在项目开始时并不总是很明显。从您的问题的语气看来,跨模块使用的助手有一个中心位置,您建议应该移动这些助手?还是别的什么?
  • 将助手移动到library 很容易。您也可以将助手创建为Application_View_Helper_,整个应用程序通用。
  • 我会确切地推荐takehin拥有的东西。我不是故意要流鼻涕的,我只是在完全回答之前要求澄清。在这种情况下,在我看来,只需重构帮助器并将其移动到您的公共库中将是最佳实践。
  • @jason,并不意味着流鼻涕,只是您的问题似乎表明您正在准备的答案类型。 :)

标签: php zend-framework plugins


【解决方案1】:

补充 Chillini 的回答,并回应 Starx 的后续评论:

如果 $view 未定义,请尝试将其添加到您的引导程序中:

protected function _initView()
{
    // Initialize view
    $view         = new Zend_View();
    $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
        'ViewRenderer'
    );
    $viewRenderer->setView($view);
    $view->addHelperPath(
        APPLICATION_PATH . '/views/helpers/',
        'My_View_Helper'
    );
}

另外,我注意到您可能希望将 class Modulea_Zend_View_Helper_Ouput 更改为 class Modulea_Zend_View_Helper_Output 以防万一。

【讨论】:

    【解决方案2】:

    只加:

    resources.view.helperPath.Application_View_Helper = APPLICATION_PATH "/views/helpers"
    

    够了..

    【讨论】:

      【解决方案3】:

      您可以在引导程序中将帮助程序添加到您的视图中

      $this->bootstrap('view');
      $view->addHelperPath(APPLICATION_PATH . '/views/helpers/','My_View_Helper');
      

      【讨论】:

      • 我想这会导致错误,因为 $view 没有定义。
      【解决方案4】:

      我实现它的最简单方法如下。

      1. 在您的 Library 文件夹中创建一个新文件夹,例如 Helpers
      2. 将您的 View Helper 文件放入您将命名为 Output.php 的文件中
      3. 在“Output.php”中有以下代码:
       class Helpers_Output extends Zend_View_Helper_Abstract
       {      public function ($var)
           {
            echo strip_tags($var);
            return true;
           }
       }
      

      并在您的 Application.ini 中添加视图助手路径,如下所示

      resources.view.helperPath.Helpers = "Helpers/"

      我更喜欢这种方法,因为它允许您将 Helpers 放在模块外部的中心位置,而其他地方则可以使其可用于您的整个应用程序,您只需要在 Application.ini 中输入一行即可

      【讨论】:

        【解决方案5】:

        这是我的方法:

        class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
            public function __construct($application) {
                parent::__construct($application);
                $this->bootstrap("view");
                $view = $this->getResource('view');
                Zend_Registry::set("Zend_View", $view);
            }
        }
        
        class Core_Bootstrap extends Zend_Application_Module_Bootstrap {
            public function __construct($application) {
                parent::__construct($application);
                $view = Zend_Registry::get("Zend_View");
                $view->addHelperPath(APPLICATION_PATH . "/modules/core/views/helpers", 'Core_View_Helper');
            }
        }
        

        因为应用程序范围(比如说“全局”)视图助手与模块共享,所以当一个模块需要将视图助手委托给其他模块时,您必须将其添加到应用程序的视图中。如果您的视图助手依赖于它自己的模块(即使用模型),则将其放入库中并不好。

        上面的代码允许模块在主配置文件中没有任何其他更改的情况下热插拔到应用程序中,只有一次,并且在大多数情况下它不会弄乱其他任何东西。

        【讨论】:

          【解决方案6】:

          我实际上有一个库文件夹,其中包含视图和帮助文件夹。 我把常用的助手放在这个文件夹里。

          我的结构:

          -application
            --modules
             ---modulea
             ---moduleb
          -library
            --view
             ---HELPER
          

          我已使用 set_include_path 命令将库文件夹添加到我的包含路径中。

          【讨论】:

          • 这是一个不错的解决方案 Rahim,但我不确定它是否是“正确的”解决方案。 Zend_Framework 总是让我印象深刻,因为它旨在位于 PHP 本身之上,并抽象出使用诸如 set_include_path 之类的核心函数来处理代码中的加载的需要。
          【解决方案7】:

          如果您将助手放在库路径中,它们将在任何地方自动加载。

          library
             Zend
               View
                 Helper
                   YourHelper.php
             Zend
               Controller
                 Action
                   Helper
                     YourHelper.php
          

          您可以将Zend 替换为您自己的命名空间,但您必须设置它,例如。在application.ini:

          resources.view.helperPath.Application_View_Helper = "Application/View/Helper"
          resources.frontController.actionHelperPaths.Application_Controller_Action_Helper = "Application/Controller/Action/Helper"
          

          【讨论】:

          • 强烈建议不要自己使用Zend_前缀。在未来的升级过程中,它可能会导致碰撞和意外行为。
          猜你喜欢
          • 2017-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多