代码之家  ›  专栏  ›  技术社区  ›  dr. squid

对于模块化Web应用程序,使用Zend框架还是Django?

  •  1
  • dr. squid  · 技术社区  · 15 年前

    我使用的是Zend框架和Django,它们都有优点和缺点,但它们都是各自的好兄弟。

    我想创建一个高度模块化的Web应用程序,如以下示例:

    • 模块:
      • 行政
        • 细胞质雄性不育
          • 文章
          • 部分

    我还希望所有模块都独立于所有配置文件和模板文件。

    在过去的几天里,我一直在寻找解决这一问题的方法,但是在模块设置中添加一个OMER级别感觉不太合适。我相信这是可以做到的,但我应该吗?我还将条令包括在Zend应用程序中,这可能会给我的模块设置带来更多的问题!

    当我们谈论Django时,这是一种很容易实现的方法(与概念上一样简单,而不是在实现时间或其他方面),也是一种创建Web应用程序的好方法。但是Django的一个缺点是Web主机部分。有一些Web主机提供Django支持,但没有那么多。

    因此,我想问题是什么最有价值;快速模块化开发与托管选项!

    好吧,欢迎评论!

    谢谢

    2 回复  |  直到 15 年前
        1
  •  3
  •   TomáÅ¡ Fejfar    15 年前

    我(尽管ZF用户很高兴)还是会去Django。在ZF中,“完全模块化”应用程序是一种Holly Grail。几乎不可能(或者至少在没有极端努力的情况下)创建自包含的模块,比如“将这个文件夹复制到模块目录中”,不确定django,但是根据我的想法,这里更简单……

        2
  •  4
  •   reko_t    15 年前

    您可以在ZF中相对较少的工作来实现子模块。假设您有如下目录结构:

    application/
      modules/
        admin/
          cms/
            controllers/
            views/
          controllers/
          views/
    

    您可以在引导程序中注册这样的模块(子模块使用_u将子模块与主模块分离):

    $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_控制器_路由器_路由_模块 几乎 对,你可以简单地从中扩展并添加想要的行为:

    <?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_控制器_路由器_路由_模块可以完成真正的工作。例如,以下路径:“/admin/cms/article/edit”将转换为“/admin-cms/article/edit”,这允许ZF的“:module/:controller/:action”的标准约定发挥作用。

    这允许您拥有良好的模块化结构和独立的模块,同时仍然使用漂亮的逻辑URL。您需要注意的一点是,如果使用Zend_导航并使用模块/控制器/操作参数指定导航项,则需要告诉ZF如何使用模块名称中的“/”而不是“u”来正确构建URL(默认情况下,ZF在构建URL时使用:模块/:控制器/:操作规范)。您可以通过实现自己的Zend_控制器\u操作\u帮助器\u 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_导航也可以很好地与您的子模块支持配合使用。