最近、自社の CMS の 2 番目のバージョンに備えて、フレームワークを刷新しました。通常のオブジェクトに置き換えるために、静的にした大量のものを元に戻しました。そうすることで、以前はコアファイルを調べてハッキングすることに頼っていた非常に大きな柔軟性を生み出しました。唯一の代替手段がグローバル関数である場合にのみ、静的構造を使用するようになりました。グローバル関数は、低レベルのコア機能にのみ関連しています。
私の言いたいことを示すために、bootstrap.php ファイルの数行を示します (すべての要求はそのファイルを介して送信されますが、すべてのファイルの先頭に含めることで同じ結果を得ることができます)。これは、おそらくあなたの状況で使用するもののかなり重いバージョンですが、このアイデアが役立つことを願っています. (これはすべてわずかに変更されています。)
//bootstrap.php
...
// CONSTRUCT APPLICATION
{
$Database = new Databases\Mysql(
Constant::get('DATABASE_HOST'),
Constant::get('DATABASE_USER'),
Constant::get('DATABASE_PASSWORD'),
Constant::get('DATABASE_SCHEMA')
);
$Registry = new Collections\Registry;
$Loader = new Loaders\Base;
$Debugger = new Debuggers\Dummy; // Debuggers\Console to log debugging info to JavaScript console
$Application = new Applications\Base($Database, $Registry, $Loader, $Debugger);
}
...
ご覧のとおり、アプリケーション オブジェクトを作成するためのあらゆる種類のオプションがあります。これらのオプションをコンストラクターで引数として他のオブジェクトに提供し、これらの "グローバル" な必需品にアクセスできるようにします。
データベース オブジェクトは一目瞭然です。レジストリ オブジェクトは、アプリケーション内の別の場所にアクセスする可能性のあるオブジェクトのコンテナーとして機能します。ローダーは、テンプレート ファイルなどの他のリソースをロードするためのユーティリティとして機能します。また、デバッガーはデバッグ出力を処理するために存在します。
たとえば、インスタンス化するデータベース クラスを変更すると、SQLite データベースに接続できます。(前述のように) デバッガーのクラスを変更すると、すべてのデバッグ情報が JavaScript コンソールに記録されるようになります。
さて、問題に戻ります。他のオブジェクトにこれらすべてへのアクセスをどのように許可しますか? コンストラクターに引数として渡すだけです。
// still bootstrap.php
...
// DISPATCH APPLICATION
{
$Router = new Routers\Http($Application);
$Router->routeUri($_SERVER['REQUEST_URI']);
}
...
それだけでなく、Router (またはそれを使用して作成するオブジェクト) もより柔軟です。これで、アプリケーション オブジェクトを別の方法でインスタンス化でき、それに応じて Router の動作が異なります。