1

私は自分のプロジェクトでこの問題を抱えていますが、それを解決するためにこれ以上何ができるかわかりません。

私のローカルホスト環境では問題なく動作しますが、サーバーに送信すると、このwaring +致命的なエラーメッセージで作業を停止するだけです。

Warning: include_once(model/Login.php): failed to open stream:
 No such file or directory in /var/www/ecommerce/include_path/Zend/Loader.php on line 134 Warning: include_once(): 
Failed opening 'model/Login.php' for inclusion 
(include_path='/var/www/wdna.com.br/admin2/application/../library::/var/www/wdna.com.br/admin2/library:
/var/www/wdna.com.br/admin2/application/modules.:/usr/share/php:/var/www/ecommerce/include_path') in /var/www/ecommerce/include_path/Zend/Loader.php on line 134 
Fatal error: Class 'model_Login' not found in /var/www/wdna.com.br/admin2/application/modules/default/controllers/LoginController.php on line 15

私のフォルダ構造は次のようなものです:

+---application
|   \---modules      
|       \---default
|           +---models

LoginController.php:

15        $login = new default_models_Login();
16        $login = $login->login($this->_getParam('login'), $this->_getParam('senha'));

私の関数 _initAutoloader:

protected function _initAutoloader(){        
        $autoloader = Zend_Loader_Autoloader::getInstance();
        $autoloader->registerNamespace('App');                
    }

新しいエラー:

警告: include_once(Default/Models/Login.php): ストリームを開けませんでした: No such file or directory in /var/www/ecommerce/include_path/Zend/Loader.php on line 134 Warning: include_once(): Failed opening '含めるための Default/Models/Login.php (include_path='/var/www/wdna.com.br/admin2/application/../library::/var/www/wdna.com.br/admin2/library: /var/www/wdna.com.br/admin2/application/modules.:/usr/share/php:/var/www/ecommerce/include_path') /var/www/ecommerce/include_path/Zend/Loader.php 134 行目 致命的なエラー: 15 行目の /var/www/wdna.com.br/admin2/application/modules/default/controllers/LoginController.php にクラス 'Default_Models_Login' が見つかりません

どんな助けでも大歓迎です。

4

3 に答える 3

0

オートローダは (Linux 上で) 大文字と小文字を区別するため、クラス名をどこで使用する場合でも同じ大文字小文字を使用する必要があります。コントローラーには、次のものが必要です。

$login = new Default_Models_Login();

クラスは次のように定義する必要があります。

class Default_Models_Login

(どちらの場合も大文字の 'D' と 'M' に注意してください)。

また、インクルード パスにライブラリ フォルダーが 2 回あるため (リストされている最初の 2 つのパスは同等です)、これも修正する必要があります。

編集: 申し訳ありませんが、悪い情報を提供してしまいました。標準のオートローダー(使用しているもの)は、クラス名のみに基づいてファイルシステム上のクラスを見つけることができると想定しています。Linux では大文字と小文字が区別されるため、問題を解決するには、defaultフォルダーをDefaultおよびmodelsに変更する必要がありますModels。しかし、これは他のものを壊す可能性があります。このため、標準のオートローダーは、applicationフォルダー内のクラスを自動ロードするようには設計されていません。

ZF の規則に固執したい場合、最善の解決策は、ZF のモジュール オートローダー (特に 内のクラス用に設計されているapplication/modules) を使用することです。これを行うには、次のことが必要です。

モジュールのブートストラップ ファイルを作成します。このファイルは次の場所にあり、次のものapplication/modules/default/Bootstrap.phpが含まれている必要があります。

class Default_Bootstrap extends Zend_Application_Module_Bootstrap
{

}

以下を追加して、モジュール リソースを初期化する必要がある場合もあります。

resources.modules[] =

あなたのapplication.iniファイルに。

これにより、デフォルト モジュールのモジュール オートローダーがセットアップされます。モジュール オートローダーは、デフォルトで多数の異なるリソースをセットアップします (ドキュメントを参照してください: http://framework.zend.com/manual/1.12/en/zend.loader.autoloader-resource.html#zend.loader.autoloader-resource .module )、モデル用のものを含みます。ただし、デフォルトでは、クラス名にModelではなく単語が使用されると想定されていますModels。そのため、クラス名も変更する必要がありますDefault_Model_Login(ただし、フォルダー名はそのままにしておきますmodels)。うまくいけば、それはすべてうまくいくはずです!

ZF2 では、これらすべてが約 100 倍簡単です。

于 2013-10-09T13:39:02.803 に答える
0

解決策は、新しいオートローダーを作成することです

例:

class MyLib_Autoloader implements Zend_Loader_Autoloader_Interface
{
    public function autoload($class)
    {

        $include = str_replace('_', DIRECTORY_SEPARATOR, $class);
        $folder = explode(DIRECTORY_SEPARATOR, $include);
        if(in_array($folder[0], array('default', 'cep', 'boleto')))
            require_once '..\..\application\modules\\' .  $include . '.php';
        else
            require_once $include . '.php';
        return $class;
    }

}

Bootstrap.php で呼び出しを終了します。

protected function _initAutoloading()
{
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->pushAutoloader(new MyLib_Autoloader());
}

「else」はモジュールにないクラスを呼び出すことであり、配列は私が作成したモジュールです。

于 2013-10-11T14:52:09.763 に答える