Php 在模块之间共享Zend帮助程序(视图或操作)

Php 在模块之间共享Zend帮助程序(视图或操作),php,zend-framework,plugins,Php,Zend Framework,Plugins,假设您试图让自己尽可能接近Zend Framework的宇宙视图,那么一个模块中的视图和操作帮助程序应该如何与另一个模块共享 假设我有一个有两个模块的。模块“A”有一个名为Output的视图辅助对象 class Modulea_Zend_View_Helper_Ouput extends Zend_View_Helper_Abstract { function output($var) { echo strip_tags($var); return

假设您试图让自己尽可能接近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”中的视图使用此帮助程序

文件:moduleb/views/scripts/index/index.phtml
我有个例外

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


“正确”的做法是使用模块B的视图帮助器输出。

我实际上有一个库文件夹,其中包含视图和帮助器文件夹。 我将常用助手放在此文件夹中

我的结构:

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

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

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

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

如果将助手放置在库路径中,它们将自动加载到任何位置

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"
仅添加:

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

足够..

补充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'
    );
}

此外,我注意到您可能需要将
类模块Zend\u视图\u Helper\u输出更改为
类模块Zend\u视图\u Helper\u输出,以防万一。

实现此功能的最简单方法如下所示

  • 文件夹中创建一个新文件夹,如
    助手
  • 将视图助手文件放在一个名为
    Output.php
  • 在“Output.php”中,您有以下代码:
  • 并在Application.ini中添加视图帮助器路径,如下所示

    resources.view.helperPath.Helpers=“Helpers/”

    我更喜欢这种方法,因为它允许您将助手放在模块外的中心位置,并将其放在其他位置,以使其可用于整个应用程序。您只需在应用程序中输入一行即可。ini

    以下是我的方法:

    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');
        }
    }
    
    由于应用程序范围(比如“全局”)的视图帮助程序与模块共享,因此当模块需要将视图帮助程序委托给其他模块时,必须将其添加到应用程序的视图中。如果您的视图助手依赖于自己的模块(即使用模型),那么将其放入库中是不好的


    上面的代码允许模块热插拔到应用程序中,而不需要对主配置文件进行任何其他更改,只需一次,而且在大多数情况下不会弄乱任何其他内容。

    因此,模块a中有一个视图帮助器,它实际上不是特定于模块的?Jason,这是正确的。我们经常发现/认识到,为特定模块构建的助手最终会在另一个模块中有用。这在项目开始时并不总是显而易见的。从你问题的语气来看,似乎有一个用于跨模块使用的助手的中心位置,你建议应该移动这些助手?或者别的什么?很容易将助手移动到
    库中。您还可以将助手创建为整个应用程序的通用工具
    Application\u View\u Helper\u
    。我建议您使用takeshin提供的工具。我并不是故意势利,我只是要求澄清,然后才完全回答。在这种情况下,在我看来,重构并将助手移动到您的公共库中是最佳做法。@jason,并不是想暗示snotty,只是您的问题似乎表明您准备好了什么样的答案。:)拉希姆,这是一个不错的解决方案,但我不确定它是否“正确”。Zend_框架一直给我留下深刻的印象,因为它是要放在PHP本身之上的,并且不需要使用诸如set_include_path之类的核心函数来处理代码中的加载。强烈建议不要自己使用
    Zend_
    前缀。在将来的升级过程中,它可能会导致冲突和意外行为。我想这会导致错误,因为$view没有定义。
     class Helpers_Output extends Zend_View_Helper_Abstract
     {      public function ($var)
         {
          echo strip_tags($var);
          return true;
         }
     }
    
    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');
        }
    }