我正在从事用 CakePHP 编写的即将离任的专用项目,该项目变得相当大。该架构也使用了一堆插件。从项目一开始,这个应用程序只有一个实例。然而,客户发现该应用程序可以工作的另一个领域。它将使用相同的代码库但单独的数据库。问题是代码库实际上适用于大约 90%,这意味着在大多数情况下它会完成它的工作,但需要进行一些细微的更改。经过一些小的改进后,很明显这些修改将继续用于这个新实例。但同时会有适用于这两种情况的更改。对于在整个应用程序中创建一堆条件并检查哪个实例实际正在运行,这不是一个非常干净的解决方案。
所以我的想法是:
- 将项目保存在一个存储库中,并在一个代码库中进行适用于所有实例的更改和修复
- 制作某种“mod”,其中包含仅在需要时重载项目默认类的类,并且仅适用于特定实例
- 为了更清楚,最好对包含这些新类的应用程序目录具有并行文件结构(当然只有那些需要的)
- 很重要的一点是根本不碰蛋糕芯,我希望可以随时升级没有问题
例子:
app/controllers/invoices_controller.php:
InvoicesController extends AppController {
public function generateInvoice() {}
}
newbusinness/controllers/invoices_controller.php:
NewbusinessInvoicesController extends InvoicesController {
public function generateInvoice() {}
}
什么时候我们要去:
www.mynewbusinnes.com/Invoices/generateInvoice
系统会自动调用NewbusinessInvoicesController->generateInvoice()
,因为存在这样的子控制器和方法。否则它将调用默认控制器和方法。
那么有可能为 CakePHP 创建这样的模式,也许是在低级别的加载类上?例如,我不想使用runkit_method_redefine()
和替换该App::import()
方法,只要runkit_method_redefine()
标记为“实验性”即可。有什么建议或想法吗?