我正在使用Zend框架和Django,他们都有自己的优点和缺点,但他们都是以自己的方式做好的工作。
我确实想要创建一个高度模块化的Web应用程序,如下例所示:
我还希望所有模块都包含所有confid和模板文件。
我一直在研究解决这个问题的方法是在最后几天,但是在模块设置中添加一个omer级别感觉不对。我相信这可以做到,但我应该这样做吗?我还将Doctrine包含在我的zend应用程序中,这可能会让我在模块设置中遇到更多问题!
当我们谈论Django时,这很容易实现(在概念上很简单,而不是在实现时间或其他任何方面)以及创建Web应用程序的好方法。但Django的一个缺点是网络冲击部分。有一些Web主机提供Django支持,但不是很多..
那么我想问题是最有价值的问题;快速模块化开发与托管选项!
嗯,欢迎提出意见!
谢谢
答案 0 :(得分:4)
您可以在ZF中以相对较少的工作量实现子模块。假设您有目录结构,例如:
application/
modules/
admin/
cms/
controllers/
views/
controllers/
views/
您可以在引导程序中注册这样的模块(子模块使用_将子模块与主模块分开):
$frontController->setControllerDirectory(array(
'default' => APPLICATION_PATH . '/modules/default/controllers',
'admin' => APPLICATION_PATH . '/modules/admin/controllers',
'admin_cms' => APPLICATION_PATH . '/modules/admin/cms/controllers'
));
这个问题是它实际上会在URL中使用下划线而不是斜杠,例如:“admin_cms / conteroller / action”而不是“admin / cms / controller / action”。虽然这“有效”,但它并不漂亮。解决此问题的一种方法是为默认路由提供自己的路由。由于默认的Zend_Controller_Router_Route_Module 几乎正确,你可以简单地从它扩展并添加想要的行为:
<?php
class App_Router_Route_Module extends Zend_Controller_Router_Route_Module
{
public function __construct()
{
$frontController = Zend_Controller_Front::getInstance();
$dispatcher = $frontController->getDispatcher();
$request = $frontController->getRequest();
parent::__construct(array(), $dispatcher, $request);
}
public function match($path)
{
// Get front controller instance
$frontController = Zend_Controller_Front::getInstance();
// Parse path parts
$parts = explode('/', $path);
// Get all registered modules
$modules = $frontController->getControllerDirectory();
// Check if we're in default module
if (count($parts) == 0 || !isset($modules[$parts[0]]))
array_unshift($parts, $frontController->getDefaultModule());
// Module name
$module = $parts[0];
// While there are more parts to parse
while (isset($parts[1])) {
// Construct new module name
$module .= '_' . $parts[1];
// If module doesn't exist, stop processing
if (!isset($modules[$module]))
break;
// Replace the parts with the new module name
array_splice($parts, 0, 2, $module);
}
// Put path back together
$path = implode('/', $parts);
// Let Zend's module router deal with the rest
return parent::match($path);
}
}
在你的引导程序中:
$router = Zend_Controller_Front::getInstance()->getRouter();
$router->addRoute('default', new App_Router_Route_Module);
它的作用是遍历路径,只要它找到一个模块,并透明地重写路径,以便默认的Zend_Controller_Router_Route_Module可以完成真正的工作。例如,以下路径:“/ admin / cms / article / edit”将转换为“/ admin_cms / article / edit”,它允许ZF的标准约定“:module /:controller /:action”做魔术
这允许您拥有带有独立模块的漂亮模块化结构,同时仍然使用漂亮的逻辑URL。您要注意的一件事是,如果您使用Zend_Navigation并使用模块/控制器/操作参数指定导航项,则需要告诉ZF如何在模块名称中使用“/”而不是“_”正确构建URL (默认情况下,ZF在构建URL时使用:module /:controller /:action规范)。您可以通过实现自己的Zend_Controller_Action_Helper_Url来实现这一点,如下所示:
<?php
class App_Router_Helper_Url extends Zend_Controller_Action_Helper_Url
{
public function url($urlOptions = array(), $name = null, $reset = false, $encode = false)
{
// Replace the _ with / in the module name
$urlOptions['module'] = str_replace('_', '/', $urlOptions['module']);
// Let the router do rest of the work
return $this->getFrontController()->getRouter()->assemble($urlOptions, $name, $reset, $encode);
}
}
在你的引导程序中:
Zend_Controller_Action_HelperBroker::addHelper(new App_Router_Helper_Url);
现在,Zend_Navigation也可以很好地支持你的子模块。
答案 1 :(得分:3)
我(尽管ZF用户很开心)会选择Django。在ZF,“全模块化”应用程序是一种冬青圣杯。创建自包含的模块几乎是不可能的(或者至少没有极大的努力),像“将这个文件夹复制到你的模块目录”一样不稳定:)不确定Django,但是从我的头脑中看它更简单......