私はかなり大きく成長した CakePHP で書かれた発信専用プロジェクトに取り組んでいます。このアーキテクチャは、多数のプラグインも使用します。プロジェクトの最初から、このアプリケーションのインスタンスは 1 つしかありませんでした。ただし、クライアントは、アプリケーションが機能する別の領域を見つけました。同じコードベースを使用しますが、別のデータベースを使用します。問題は、コードベースは実際には約 90% で適用できるということです。つまり、ほとんどの場合、コードベースは機能しますが、必要なわずかな変更がいくつかあります。いくつかの小さな機能強化の後、これらの変更がこの新しいインスタンスに対して継続されることは明らかです。しかし同時に、両方のインスタンスに適用される変更があります。アプリケーション全体で一連の条件を作成し、どのインスタンスが実際に実行されているかを確認するための非常にクリーンなソリューションではありません。
だから私の考えは:
- プロジェクトを 1 つのリポジトリに保持し、1 つのコードベースのすべてのインスタンスに適用可能な変更と修正を行う
- 必要な場合にのみ、特定のインスタンスに対してのみ、プロジェクトのデフォルト クラスをオーバーロードするクラスを含む、ある種の「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()