php - Cake PHP - 为应用程序创建某种 mod

标签 php cakephp url-routing autoloader

我正在开发用 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(),因为这样的子 Controller 和方法存在。否则它将调用默认 Controller 和方法。

那么是否可以为 CakePHP 创建这样的模式,也许是在低级别的加载类上?我不想使用 runkit_method_redefine() 并替换例如 App::import() 方法,只要 runkit_method_redefine() 是标记为“实验性”。有什么建议或想法吗?

最佳答案

So is possible to create such mode for CakePHP, maybe on low level of loading classes? I would not like to use runkit_method_redefine() and replace for example the App::import() method, as long as runkit_method_redefine() is marked as "experimental". Any suggestions or ideas?

所有请求最初都会经过app/webroot/index.php。该文件不是核心的一部分,可以自行修改。你能做的就是改变 include pathsCAKE_CORE_INCLUDE_PATH 之前列出您自己创建的文件夹。这里我将 /absolute/path/to/custom 设置为包含路径:

if (function_exists('ini_set') && ini_set('include_path', ROOT . DS . 'custom' . PATH_SEPARATOR . CAKE_CORE_INCLUDE_PATH . PATH_SEPARATOR . ROOT . DS . APP_DIR . DS . PATH_SEPARATOR . ini_get('include_path'))) {

在本节之后,CakePHP 的核心引导文件被加载 (/cake/bootstrap.php),并且许多核心类开始加载:

require CORE_PATH . 'cake' . DS . 'basics.php';
$TIME_START = getMicrotime();
require CORE_PATH . 'cake' . DS . 'config' . DS . 'paths.php';
require LIBS . 'object.php';
require LIBS . 'inflector.php';
require LIBS . 'configure.php';
require LIBS . 'set.php';
require LIBS . 'cache.php';
Configure::getInstance();
require CAKE . 'dispatcher.php';

插入您自己的包含路径后,您可以通过将它们复制到该路径来替换它们:

ROOT
|- app/
|- cake/
  |- libs/
    |- configure.php // this would usually be loaded
|- custom/
  |- cake/
    |- libs/
      |- configure.php // now this is loaded

(注意:configure.php 文件包含 ConfigureApp 类。)

简而言之,通过更改 app/webroot/index.php 中的一行,您现在可以替换 CakePHP 核心的任何部分,而无需直接编辑它。

您现在可以对 App::import 进行所需的更改,但是,由于实际上没有在任何地方记录这一点,因此您的情况可能会有所不同。

关于php - Cake PHP - 为应用程序创建某种 mod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8896641/

相关文章:

c# - 哪些体系结构可用于分解单一的 ASP.NET 网站?

javascript - Angular JS 和 Node 路由/接线 - 数据仅在页面刷新后显示

php - 2 表MYSQL PHP查询并应用PHP填充HTML网格显示

php - SQL_BIG_SELECTS,优化我的查询

php - CakePHP:调用非对象上的成员函数 find()

jakarta-ee - FacesServlet 如何根据 URL 知道要呈现哪个 facelet?

php - typo3 网站爬虫没有索引

php - 处理大格式输入中的 "Kill"

cakephp - 如何在子目录中安装 CakePHP 3

php - cakephp 知道 Controller 本身的所有设置变量