我们正在利用Zend Framework开发一个电子商务平台。我们使用相同的代码库启动并运行了多个应用程序实例。配置设置用于区分各个商店。
我们面临的挑战是,我们希望保持现有的通用平台,并扩展它而不是使用上面概述的配置方法。通用平台(或基础应用程序)应包含通用控制器,模型和视图。特定于特定实例的自定义功能(控制器,模型和视图)应包含在单独的扩展中,并以插入核心平台的方式包含。这样,共享代码库保持干净,不会过度膨胀。
有没有人有这种方法的经验?有没有最好的做法?
非常感谢任何指针!
答案 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/S24
和modules/ecommerce
文件夹是常见的,每个项目都是相同的(我们SVN外部这些文件夹)。
app
是一个模块目录,因此default
和ecommerce
文件夹在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)根据类名创建单独的文件夹。这可能有助于将代码与其他实现分离出来。