2009-10-28 99 views
1

我正在使用Zend框架和Django,他们都有他们的优点和缺点,但他们都是以自己的方式好的框架。转到Zend框架或Django模块化的Web应用程序?

我想创建一个高度模块化的Web应用程序,像这样的例子:

  • 模块:
    • 联系
      • CMS
        • 文章
        • 部分
      • ...
        • ...
          • ...

我也希望所有的模块是SE如果包含所有confid和模板文件。

我一直在寻找一种方法来解决这个问题是zend的最后几天,但增加一个omer级别的模块设置感觉不对。我确信这可以完成,但我应该吗?我还将Doctrine包含在我的zend应用程序中,可以在模块设置中给我更多问题!

当我们谈论Django时,这很容易实现(在概念上很容易,而不是在执行时间或其他方面)以及创建Web应用程序的好方法。但是Django的缺点之一就是网页部分。有一些网络主机提供Django的支持,但没有那么多..

那么我猜问题是什么有最大的价值;快速模块化开发与托管选项!

好,欢迎您评论!

感谢

回答

4

我(尽管快乐ZF用户)会去Django的。在ZF中,“完全模块化”的应用程序是一种圣杯。这几乎是不可能的(或至少没有特别的努力)我头很simplier那里建立自足的模块,像instalable“文件夹复制到你的模块目录” :)不知道有关Django的,但是从...

+0

Tkanks,这也是我的印象 – 2009-10-28 12:56:16

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 spec)。您可以通过实现自己的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与子模块的支持很好地工作为好。

+0

感谢。 我确实认为这是解决这个问题的一种可能方式,但是我仍然觉得自己使用zend有点难,因为它迫使我将自定义代码写入一些本应该是相当简单的任务。但这也是Zend成为一个伟大框架的原因;你并不是被迫以某种特定的方式来做事... 我仍然倾向于Django,但是使这个设计相当困难.. 但是,谢谢你的好例子 – 2009-10-28 09:49:29