3

Zend_Applicationを使用してアプリケーションをセットアップしました。_initAutoload()Bootstrap.phpに次のようなメソッドがあります。

 public function _initAutoload(){
     $this->bootstrap("frontController");
     $front = $this->frontController;

     $autoloader = Zend_Loader_Autoloader::getInstance();

     $autoloader->registerNamespace('Client_');
     $autoloader->registerNamespace('Frontend_');
     $autoloader->registerNamespace('Global_');
     $autoloader->registerNamespace('Global_Helper_');
     $autoloader->setFallbackAutoloader(true);

     $modules = $front->getControllerDirectory();
     $default = $front->getDefaultModule();

     foreach (array_keys($modules) as $module) {
         if ($module === $default) {
             continue;
         }

         $autoloader->pushAutoloader(new Zend_Application_Module_Autoloader(array(  
             "namespace" => ucwords($module),
             "basePath" => $front->getModuleDirectory($module),
         )));

     }

     return $autoloader;  
 }

デフォルトのモジュールにもプレフィックスを付けるようにFrontControllerを設定しました(私にはもっと論理的だと思います) $front->setParam("prefixDefaultModule", true)

私は通常のディレクトリ構造を持っていると思います。

問題:

私が持っているすべてのモジュールにサブドメインを設定しました。メインのメインドメイン(www)ではすべて正常に動作します。メインモジュールはフロントエンドです。フロントエンドがデフォルトのモジュールである場合、スタッフは機能します:)。Ok。今。すべてのサブドメインについて、同じindex.phpがありますが、env値が変更されています。クライアントサブドメインの場合、env値はclientなどです。各env値は、私のapplication.xmlセクションに対応します。各application.xmlサブドメインセクション(client、apiなど)は、デフォルトと呼ばれるメインセクションを拡張します(現在、エラーなどを有効にするテストセクションもあるため、すべてのサブドメインがテストを拡張し、testingがデフォルトを拡張します)。

application.xmlの各サブドメインセクションは、デフォルトのモジュール名を変更します。したがって、セクションのデフォルトはフロントエンド、セクションクライアントのデフォルトはクライアントなどです。

domain.com/clientまたはdomain.com/api
にアクセスすると、問題ありません。APIとクライアントの両方がClient_Model_NameOfTheModelを使用し、想定どおりに、application / modules / client / models/NameOfTheModel.phpとDbTable/NameOfTheModel.phpにあります

しかし、それぞれのサブドメイン(client.domain.com、 api.domain.com など)からモジュールにアクセスし、デフォルトのモジュールがフロントエンドからそれぞれのサブドメインモジュール名に変更された場合、動作を終了します。その「スタックトレース」も出力しません。

警告:include(Client / Model / ContactLists.php)[function.include]:ストリームを開くことができませんでした:[heres-my-path-to-root]/library/Zend/Loader.phpオンラインにそのようなファイルまたはディレクトリはありません136

警告:include()[function.include]:インクルードのために'Client / Model / ContactLists.php'を開くことができませんでした(include_path ='[heres-my-path-to-root] / library:。:/ usr / lib / php :/usr/local/lib/php')[heres-my-path-to-root]/library/Zend/Loader.phpの136行目

致命的なエラー:クラス'Client_Model_ContactLists'が[heres-my-path-to-root]/application/modules/client/controllers/ContactListsController.phpの4行目に見つかりません

私はそれを機能させるために2日間試しました。そうではありません。これはデフォルトのドメインでのみ機能し、application.xmlがデフォルトのモジュールをサブドメイン名に変更した場合は機能しません。そのように。この点は現在非常に重要です。続行できず、このアプリは今週の終わりまでにサンドボックスから外れる必要があるためです(初期のベータ版)。

アドバイスをありがとうございます。
PS。英語が下手でごめんなさい。私の母国語ではありません

4

2 に答える 2

3

これは単なる推測ですが、次の行があるため、デフォルトで機能しているように見えます。

 $autoloader->setFallbackAutoloader(true);

 $modules = $front->getControllerDirectory();
 $default = $front->getDefaultModule();

 foreach (array_keys($modules) as $module) {
     if ($module === $default) {
         continue;
     }

基本的に、モジュールがデフォルトのモジュールである場合、それはスキップされます。つまり、私が想定するフォールバック オートローダーにフォールバックし、デフォルトのオートローダーがモデルを見つけられない場合は、問題があります。エラーのルート パスとロードしようとしているクラスのパスの連結は正しいですか?

また、これは間違っている可能性があるようです

         "namespace" => ucwords($module),

私はそれが必要だと思うだろう

         "namespace" => ucwords($module) . "_",

他の名前空間と同様。

于 2010-01-21T23:47:38.903 に答える
1

どのバージョンの ZF を使用していますか?

1.8 - 1.10 以降のバージョンを使用していますか?

その場合、Zend_Application のリソースをモジュールに使用する必要があります。モジュールの下にあるフォーム、モデル、ヘルパーなどのオートロードを設定します。

application.ini を使用している場合は、モジュールごとに次のような行が必要です。

resources.modules.module_name = "有効"

http://framework.zend.com/manual/en/zend.application.available-resources.html#zend.application.available-resources.modules

于 2010-01-22T01:20:17.250 に答える