これが何が起こっているかです。ティム・ファウンテンは正しいです。application.ini ファイルの次の行が原因です。これを削除すると、アプリケーションが正しく読み込まれるはずです。
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
この行もフロントコントローラーの一部であるため、削除する必要がある場合があります。
resources.frontController.params.displayExceptions = 1
ただし、使用できる他の2つのオプションもありますZend_Controller_Front::getInstance()
オプション 1. index.php を変更して、特定のリソースをブートストラップします。
$application->bootstrap(array('FrontController', 'ModuleConfig'))->run();
これにより、まず application.ini から FrontController がブートストラップされ、次にinitModuleConfig
メソッドが実行されます。基本的に、これにより、どのリソースをどの順序でロードするかを制御できます。これは、特定の時間にのみブートストラップしたいリソースがある場合に役立ちます。
init
ここでブートストラップ メソッドに配列を指定しないと、宣言された順序で接頭辞が付いたすべてのメソッドが呼び出されると思います。
オプション 2. application.ini 内でモジュール ディレクトリの構成を行うことができます。
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.params.prefixDefaultModule = 1
resources.frontController.params.displayExceptions = 1
これにより、コードで実行しようとしていたことが実行されます。Bootstrap
注意すべきことの 1 つは、クラスのコンストラクターで FrontController をブートストラップしたい場合があることです。これは、カスタムの初期化中に使用する必要がある場合に備えてのものです。
ここで、オプション 1 が機能する理由について説明します。
からのメソッドです。Zend_Application_Bootstrap_BootstrapAbstract
protected function _bootstrap($resource = null)
{
if (null === $resource) {
foreach ($this->getClassResourceNames() as $resource) {
$this->_executeResource($resource);
}
foreach ($this->getPluginResourceNames() as $resource) {
$this->_executeResource($resource);
}
} elseif (is_string($resource)) {
$this->_executeResource($resource);
} elseif (is_array($resource)) {
foreach ($resource as $r) {
$this->_executeResource($r);
}
} else {
throw new Zend_Application_Bootstrap_Exception('Invalid argument passed to ' . __METHOD__);
}
}
これは、パブリックメソッド_bootstrap
を呼び出すときに呼び出されます。bootstrap
例$this->bootstrap("FrontController")
または$this->bootstrap()
;
パラメータを渡さない場合に注意してください。null
これは、あなたがあなたに得るケースであるケースを呼び出しますindex.php
-$application->bootstrap()->run();
最初にあなたをロードしclass resources
、次にあなたのplugin resources
. plugin resources
その他の場合はロードされないことに注意してください。
クラスリソースのメソッド呼び出しに従う場合、基本的にはinit
ブートストラップ呼び出しクラスでメソッドを呼び出します。
プラグイン リソースは後で呼び出され、プラグイン リソースの 1 つです。すべてのプラグイン リソースがどのように読み込まれるかは完全にはわかりませんが、1 つのソースがあなたのapplication.ini
ファイルにあると思います。これらは で始まる行になりますresources
。例には、views、frontcontroller、db が含まれます。
したがって、 を呼び出す状況では$application->bootstrap()->run();
、init
メソッドが最初にロードされます。しかし、あなたFrontController
はまだブートストラップされていません。最終的には、application.ini
. これは明らかに、ブートストラップ クラスで行ったことを上書きします。
もう 1 つの質問として、$this->bootstrap("FrontController)
明示的に呼び出したときに FrontController インスタンスがオーバーライドされない理由があります。これはかなり明白だと思いますが、個人的には私自身がこの質問をしました。
Bootstrap クラスには、呼び出されるメソッドがあり_executeResource
、リソースが既にブートストラップされているかどうかを確認します。連想配列を使用して追跡します。連想配列は と呼ばれ$this->_started
ます。
これが、フロント コントローラーを明示的にブートストラップする最初のケースで、フロント コントローラーのプラグイン リソースが呼び出されない理由です。したがって、フロント コントローラー インスタンスは置き換えられません。