从另一个模块中的控制器扩展控制器?
我有一个名为'olo'的模块来处理我们所有的在线订购内容。从另一个模块中的控制器扩展控制器?
现在我已经创建了一个名为'olosec'的新模块,因为我希望制作一个不同的版本,只需稍微改变流程,并在一些控制器中进行其他更改。
我有可能在'olo'中使用控制器在'olosec'中扩展控制器吗?
截至目前我已经试过
class Olosec_CartController extends Olo_CartController
会抛出像
Warning: include_once(Olo/CartController.php): failed to open stream:
No such file or directory in /httpdocs/library/Zend/Loader.php on line 146 Warning:
include_once(): Failed opening 'Olo/CartController.php' for inclusion.
bla bla bla (include path) bla bla bla
我的目录结构的错误是这样的(感谢tree \F \A
和EditPlus++)
+---application
| +---views
| | +---scripts
| | +---layouts
| | | +---default
| | | +---admin
| | +---languages
| | +---helpers
| +---modules
| | +---admin
| | +---mobile
| | +---olo
| | | +---controllers
| | | IndexController.php
| | | MenuController.php
| | | CartController.php
| | | OrderlistController.php
| | | |
| | | +---models
| | | \---views
| | | +---helpers
| | | \---scripts
| | | +---index
| | | +---menu
| | | +---cart
| | | \---orderlist
| | \---olosec
| | +---controllers
| | | IndexController.php
| | | MenuController.php
| | | CartController.php
| | | OrderlistController.php
| | |
| | +---models
| | \---views
| | +---helpers
| | \---scripts
| | +---index
| | +---menu
| | +---cart
| | \---orderlist
| +---models
| +---controllers
| \---configs
+---library
+---public
| +---cli
| \---default
+---tests
\---data
更新
我已经使用这个 “讨厌的” 黑客其中工程
require_once(APPLICATION_PATH . '/modules/olo/controllers/CartController.php');
更新@拉克什
我有这个在我的引导..
function _initAutoloader() {
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);
return $autoloader;
}
在我的application.ini
autoloadernamespaces.0 = "Zend"
autoloadernamespaces.1 = "My"
autoloadernamespaces.2 = "Something"
为什么没有为通用类
application/
library/ < for common classes
如果您使用不仅在一个控制器,但是在你的项目很多地方,这是一个很好的方法有些类的自定义库文件夹。
您只需在助推文件中将这个新的application/library/
文件夹添加到您的include path
。
另一种方法是有一个行动助手。但正如我所描述的常见的类文件夹应该是一个很好的解决方案。不过,我发现了一些有趣的资源,其中大部分是关于跨模块的编码,但它们可以帮助你反正http://zend-framework-community.634137.n4.nabble.com/Code-re-use-across-modules-td668554.html和How to Use Same Models in Different Modules in Zend Framework?
让我描述的另一种方法
class BasicController extends Zend_Controller_Action
{
public static $variable = '';
public function init()
{
self::$variable = 'assign value';
}
}
class HomeController extends BasicController
{
public function indexAction()
{
$bioVar = parrent::$variable;
}
}
这比简单地扩展控制器更好因为它们表示动作并且每个动作都有相应的视图脚本。但是所有的类都应该在自动加载器中注册。
我已经有相当广泛的库,但控制器类中的东西我不会考虑作为放入库中的东西 - 我理解你的想法。但是我将该库视为一个工具箱,可以在另一个项目上重用,而控制器则是处理视图脚本的流,输入,模型处理和准备数据的类。 – Phliplip 2011-05-05 10:48:48
看看我的编辑。 – 2011-05-05 11:12:47
如果你已经从Zend Autoloader实例化类,错误应该消失。
您的引导程序中应该包含以下代码。PHP文件:
protected function _initAutoloader()
{
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => '',
'basePath' => APPLICATION_PATH . '/modules',
));
return $autoloader;
}
在一般情况下,控制器通过装化Zend_Controller_Dispatcher,你应该使用Zend_Application_Module_Autoloader从其他控制器类实例化。
@Tomalak Geret'kal:有什么不对劲的问候;)是的,'我'..我总是忘记大写他们。但感谢编辑! – Phliplip 2011-05-05 12:14:43
虽然你的意思只是要礼貌的问候,因为堆栈溢出不是一个留言板,我们更喜欢问题只是包含这个问题。它节省空间,避免膨胀,并保持OCD快乐。 :) – 2011-05-05 12:17:17
@Tomalak Geret'kal:我会记住这一点;) – Phliplip 2011-05-05 12:19:39