我正在寻找有关如何从application
文件夹包含models,views,controllers
的左侧的常规文件夹结构转到基于模块的文件夹结构的分步说明application
包含modules
文件夹的权利,该文件夹包含具有各自models,views,controllers
的各个模块。
我说“转换”因为我认为zend不允许我们从一开始就使用模块架构创建项目,但如果确实如此,那将会膨胀并且无需手动更改这些文件夹结构。
这是我迄今为止的经历
当我创建模块zf create module product
时,会生成modules文件夹,并在其中生成文件夹product
,并且还会生成该模块的views,controllers,models
。
但我还需要将主views,controllers,models
移动到他们自己的modules/default
文件夹中。如果我手动创建该文件夹并在那里移动主views,models,controllers
,那么在尝试向该default
模块添加新控制器时会出现错误。该错误是重新生成 views,controllers,models
中的主要(现在缺失)application
并在application/controllers/newcont
中插入新控制器,因为它无法识别默认控制器文件夹已手动移至application/modules/default/controllers/
。
所以我的解决方案是zf create module default
,然后将主views,models,controllers
复制到那里。它最终看起来一样,但不知怎的,zf create module
方法有所不同。当我这样做时,新的控制器被正确添加到application/modules/default/controllers
而不是application/controllers
问题的一半解决了。但是当我尝试查看应用程序时,我看不到index/index
视图中的任何内容。我也没有任何错误,但我什么都没看到。我怀疑这是因为应用程序不知道index/index
视图已移动。
application/views/scripts/index/index.phtml
application/modules/default/views/scripts/index/index.phtml
我猜我需要对application.ini或bootstrap.php或其他位置进行更改。那么究竟是什么步骤让这件事顺利完成并让它发挥作用?我正在使用最新的ZF 1.10.8。请从创建一个新的zend项目开始,这样就不会对确切的步骤产生混淆。
答案 0 :(得分:10)
以下是我尝试按照您的示例(从头开始)所做的事情:
$ zf create project .
$ zf create module product
$ zf create module default
然后我将controllers
,models
和views
从./application
移至./application/modules
。
接下来我打开了application.ini,替换了这一行(它告诉ZF在非模块化应用程序中找到控制器的位置):
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
使用:
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
告诉ZF在哪里找到模块。
然后我手动为产品模块创建了一个索引控制器,这样我就可以测试它是否有用了。然后我点击http://localhost/index/index以查看默认模块索引操作是否仍然有效,但它没有,而是我收到了错误:
致命错误:未捕获的异常'Zend_Controller_Dispatcher_Exception',消息'Invalid controller class(“Default_ErrorController”)'in ...
听起来这就是你要去的地方。
有两种方法可以解决此错误,文档很容易引起误解(可能甚至是错误的)。它states:
请注意,在默认模块中,控制器不需要名称空间前缀。因此,在上面的示例中,默认模块中的控制器不需要前缀'Default_' - 它们只是根据它们的基本控制器名称调度:'IndexController'和'FooController'。但是,名称空间前缀用于所有其他模块。
但很明显上面的错误表明ZF正在寻找名为Default_ErrorController的ErrorController类。要解决此问题,您可以执行以下两项操作之一:
IndexController
更改为Default_IndexController
,将application / modules / default / controllers / ErrorController.php更改为ErrorController
到Default_ErrorController
或删除此行:
resources.frontController.params.prefixDefaultModule =“1”
。这一行告诉ZF在默认模块类上使用'Default_'命名空间,所以没有它它只会查找'IndexController'。我选择后一个选项,然后http://localhost/index/index按预期工作。
在你的情况下,你说你在/ index / index上有一个空白页面,这意味着:
要检查最后一个选项,请在生产部分中打开application.ini,然后暂时将phpSettings.display_errors
从0更改为1。如果你在上面遇到同样的错误,希望你能够让一切正常。
我希望这会有所帮助。我可以说的是,不要太依赖Zend_Tool来管理您的应用程序 - 它无法完成所有事情,并且通常手动移动事物比尝试通过所有事情更容易。 zf命令;特别是在重组时。
答案 1 :(得分:1)
我是Netbeans IDE的开发者。
http://i.stack.imgur.com/n9Zjn.jpg
我是新手:P(需要10分)
每个Bootstrap应该有:
<?php
// Public_Bootstrap replace for Blog_Bootstrap or Administrator_Bootstrap
// well its for me
class Public_Bootstrap extends Zend_Application_Module_Bootstrap {
}
主要引导:
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
protected function _initAutoLoad() {
$modLoader = new Zend_Application_Module_Autoloader(
array(
'namespace' => '',
'basePath' => APPLICATION_PATH . '/modules/public'
)
);
return $modLoader;
}
public function _initViewHelpers() {
$this->bootstrap(array('frontcontroller', 'view'));
$view = $this->getResource('view');
$view->doctype('XHTML1_STRICT');
$view->headMeta()->appendHttpEquiv("Content-Type", "text/html;charset=UTF-8")
->appendName("description", "Some description");
}
}
application.ini:
[production]
resources.modules[] =
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.defaultmodule = "public"
resources.frontController.prefixDefaultModule = true
resources.view[] =
resources.db.adapter = PDO_MYSQL
resources.db.isDefaultTableAdapter = true
resources.db.params.host ="localhost"
resources.db.params.username ="yourUser"
resources.db.params.password ="yourPassword"
resources.db.params.dbname ="DBName"
我的引导程序包含更多代码,包括插件。