6
class SomeController extends Controller
{

        public function actionIndex() {
                echo 'This is some controller';
        }
}


class AnotherController extends SomeController
{

        public function actionIndex() {
                echo 'This is another controller';
        }
}

これは機能します:

index.php?r=some

しかし ...

index.php?r=another

言います:

PHP 警告

include(SomeController.php): ストリームを開けませんでした: そのようなファイルまたはディレクトリはありません

両方のファイルが

test\protected\controllers\

ところで、過去に「SomeController」を基本クラスとしてGii Controller Generatorを使用してみました...

と言いました:

The controller has been generated successfully. You may try it now.

Generating code using template 
"C:\xampp\htdocs\yii\framework\gii\generators\controller\templates\default"...
generated controllers\YetAnotherController.php
generated views\yetAnother\index.php
done!

「今すぐ試す」をクリックすると、次のようにも表示されました。

PHP 警告

include(SomeController.php): ストリームを開けませんでした: そのようなファイルまたはディレクトリはありません

4

2 に答える 2

12

編集:

protected/controllers内のクラスは自動ロードされないため、拡張する前に親クラス ファイルをインポートする必要があります。

AnotherController.php:

Yii::import('application.controllers.SomeController');
public class AnotherController extends SomeController {
    // ...
}

URL からも基本クラスにアクセスする必要がある場合は、上記の方法を使用できます。それ以外の場合は、すでにわかっているように、基本クラスをprotected/components内に配置できます。


Yii オートロードは、ファイルに含まれるクラスと同じ名前のファイルを持っている場合にのみ機能します。意味はSomeController.phpファイルclass SomeController内にある必要があります。

これらの変更を行うと、機能するはずです。

役立つ wiki: Understanding Autoloading Helper Classes and Helper functions

ガイドリンク:

クラス ファイルは、含まれるパブリック クラスにちなんで命名する必要があります。

于 2013-01-04T03:08:41.587 に答える
3

任意のクラスを拡張するには、構成ファイルに移動して、インポート セクションにクラスを追加します。

'import' => array('application.controllers.SomeController')

これにより、明示的にインポートしなくても、アプリケーション全体で使用できるようになります。

于 2013-01-11T14:58:51.623 に答える