0

この問題に密接に関連するいくつかの答えを見つけましたが、それでも解決できません。インクルードパスに問題があると言われていると思いますが、見つけたすべての解決策を試しましたが、役に立ちませんでした。

エラーは次のとおりです。

Fatal error: Class 'Zend_Controller_Action' not found in /Users/*me*/Sites/*site*/application/controllers/IndexController.php on line 3

includeステートメントは次のとおりです。

$newIncludePath = array();
$newIncludePath[] = '.';
$newIncludePath[] = 'include';
$newIncludePath[] = get_include_path();
$newIncludePath[] = '../library';
$newIncludePath[] = '../application/classes/';
$newIncludePath[] = '../application/models/';
$newIncludePath[] = '../application/models/';
$newIncludePath[] = '../application/controllers';
$newIncludePath = implode(PATH_SEPARATOR, $newIncludePath);
set_include_path($newIncludePath);

require_once 'Zend/Controller/Front.php';
require_once 'Zend/Loader.php';

Zend_Loader::registerAutoload();

私は何時間もフォーラムを精査してキーボードに頭をぶつけてきました。私はzendとphpを初めて使用します。このようなものは私に王室の頭痛の種を与えました。パスにコントローラーを明示的に追加しました。何を見落としているのかわかりません。

ところで、サイトはプライバシー上の理由から編集された名前です。

私は解決に永遠に感謝しています。

mjs-編集:

インクルードが少し不安定であることに気づきました。だからここにやり直しがあります:

$newIncludePath = array();
$newIncludePath[] = '.';
$newIncludePath[] = get_include_path();
$newIncludePath[] = '../library';
$newIncludePath[] = '../application/classes/';
$newIncludePath[] = '../application/models/';
$newIncludePath[] = '../application/library/';
$newIncludePath = implode(PATH_SEPARATOR, $newIncludePath);
set_include_path($newIncludePath);

var_dumpの出力:

string(148) "../application/controllers:.:.:/Applications/MAMP/bin/php5/lib/php:../library:../application/classes/:../application/models/:../application/library/"

Zend / Controller/Actionが../libraryの下にあることに気づきました。だから、なぜアプリがそれを見つけられないのか分かりません。

PHPDebugからIndexControllerを実行すると、

string(170) ".:/Users/me/Sites/site:/Applications/Zend/Zend Studio - 7.1.0/plugins/org.zend.php.framework.resource_7.1.0.v20091101-1523/resources/ZendFramework-1/library/" 
Fatal error: Class 'Zend_Controller_Action' not found in /Users/me/Sites/site/application/controllers/IndexController.php on line 5
4

2 に答える 2

3

Zend_Appilcation オートローダーのデフォルトの動作は、クラス名を取ることです

Zend_Controller_Action

そしてそれをパスに変換します

Zend/Controller/Action.php

次に、クラスをロードするために必要なファイルをインクルード/要求しようとします。

したがって、2つの異なる問題が発生する可能性があります

  1. PHP インクルード パスがデフォルトの Zend ライブラリ フォルダーを指していないため、インクルードしようとするとZend/Controller/Action.php失敗します。

  2. オートローダーが正しく登録されていません

したがって、IndexController.phpファイルで、クラス宣言の上のグローバル名前空間領域に次を追加します。

var_dump(get_include_path());

これにより、インクルード パスの値が出力されます。インクルード パスの個々のパスを確認しZend/Controller/Action.php、それらの 1 つに追加すると Action.php ファイルに解決されることを確認します。そうでない場合は、これを可能にするパスがそこにあることを確認するための手順を実行します。

(上記は、独自の Zend Framework に基づく Zend 独自のアプリケーション フレームワークである Zend_Application を使用していることを前提としています。コンポーネントをスタンドアロンで使用している場合は、さらに複雑になる可能性があります)。

于 2009-12-12T03:17:04.150 に答える
0

インクルード パスはアプリケーション ルートからの相対パスですが、ファイルは別のレベル (つまり、アプリケーション/コントローラー) で読み込まれています。そのため、すべてのインクルード パスが application/controllers/../library のようになりましたが、これは正しくありません。

インクルード パスに絶対パスを使用して、これを修正します。たとえば、../library を Users/ me /Sites/ site /libraryに変更してみてください。

于 2009-12-12T03:16:14.567 に答える