Php 在模块之间共享Zend帮助程序(视图或操作)
假设您试图让自己尽可能接近Zend Framework的宇宙视图,那么一个模块中的视图和操作帮助程序应该如何与另一个模块共享 假设我有一个有两个模块的。模块“A”有一个名为Output的视图辅助对象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
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');
}
}