使用Zend Framework创建灵活的基础应用程序

时间:2009-05-12 12:08:10

标签: php zend-framework web-applications modularity

我们正在利用Zend Framework开发一个电子商务平台。我们使用相同的代码库启动并运行了多个应用程序实例。配置设置用于区分各个商店。

我们面临的挑战是,我们希望保持现有的通用平台,并扩展它而不是使用上面概述的配置方法。通用平台(或基础应用程序)应包含通用控制器,模型和视图。特定于特定实例的自定义功能(控制器,模型和视图)应包含在单独的扩展中,并以插入核心平台的方式包含。这样,共享代码库保持干净,不会过度膨胀。

有没有人有这种方法的经验?有没有最好的做法?

非常感谢任何指针!

3 个答案:

答案 0 :(得分:2)

我最近在我的代理机构看到了同样的问题,我正在测试的解决方案涉及以下app文件夹结构:

app/
    default/
            controllers/
            models, etc
    ecommerce/
              controllers/
              models, etc
lib/
    S24/
        ComponentCode.php
modules/
        ecommerce/
                  admin/
                        controllers/
                        models, etc
                  default/
                          controllers/
                          models, etc
data, public web, temp, other ZF folders

这个想法是通用组件代码存储在lib中,模块化应用程序存储在modules中,单个客户端网站代码存储在app中。

lib/S24modules/ecommerce文件夹是常见的,每个项目都是相同的(我们SVN外部这些文件夹)。

app是一个模块目录,因此defaultecommerce文件夹在ZF中创建模块。 app/default用于默认(即无模块)控制器。 app/ecommerce将包含一组控制器,只需在modules/ecommerce/default/controllers内扩展控制器。

如果您愿意,可以在app/ecommerce/controllers中扩展功能,或者添加新功能。

由于我们希望保持模块管理系统不变并且还支持多个管理系统(在www.domain.com/admin/ecommerce和www.domain.com/admin/user等URL中),我们为模块化管理系统提供服务直接来自modules文件夹。然后,可以将任何自定义管理页面添加到app/admin/controllers

// Add Controller folder
$front->addControllerDirectory('/path/to/modules/ecommerce/admin/controllers', 'ecommerceAdmin');

// Add route
$router->addRoute(
    'ecommerceAdmin',
    new Zend_Controller_Router_Route('admin/ecommerce/:controller/:action',
                                     array('module' => 'ecommerceAdmin', 
                                           'controller' => 'index',
                                           'action' => 'index'))
);

正如我所说,我目前正在测试这个,但我希望它能为您自己的系统提供一些想法。一旦我完全稳定了,我希望写一篇关于这个主题的博客文章。

答案 1 :(得分:0)

我们将软件作为服务应用程序运行,听起来与您的平台类似,在我们的例子中,所有实例数据都存储在实例自己的数据库中。

至于处理自定义功能(代码),如果它完全是定制的,那么我认为将自定义代码模块化或打包到容器中是有意义的,该容器可以由客户的唯一标识符引用并按需加载代码。这对于模块来说很简单,但如果您需要单独的控制器甚至是操作,那么显然会更复杂。

某些系统构建了自己的事件/回调系统,允许注入功能,但这对于公共API更为常见。

答案 2 :(得分:0)

编辑:我没有注意到各种评论。因此,自定义的代码不在一个单独的包中,它增加了功能而不会覆盖。

这里的问题是你提到代码不会覆盖任何东西,而是添加功能。您可能正在查看某种形式的插件系统,您可以在其中读取带有类名的配置文件。这些类将提供有关每个插件的信息(例如,如果您的UI使用制表符,它将具有制表符名称的属性)。

这实际上取决于每种实现的功能类型。获得更多信息以提供高级解决方案可能会有所帮助。

我使用PHP自动加载的方式(请参阅:How does OOP manage to 'include' classes stored in different files)根据类名创建单独的文件夹。这可能有助于将代码与其他实现分离出来。