Yii - 从自定义控制器类继承 - 找不到

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

but ...

index.php?r=another

提示信息:

PHP警告

include(SomeController.php): 打开文件失败: 没有那个文件或目录

两个文件都在同一目录下。

test\protected\controllers\

顺便提一下,过去我也尝试使用Gii Controller Generator以"SomeController"作为基类...

它显示:

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):无法打开流:没有那个文件或目录

2个回答

12

编辑:

protected/controllers 中的类不会自动加载,因此您需要在扩展之前导入父类文件:

AnotherController.php 中:

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

如果您需要从URL访问基类,您可以使用上述方法。否则,您可以像您已经找到的那样将基类放在protected/components中。


Yii自动加载仅在文件名与文件中包含的类相同时才起作用。这意味着class SomeController应该在SomeController.php文件中。

做出这些更改,它就应该可以工作了。

一个有用的维基:理解自动加载帮助类和帮助函数

指南链接:

  

类文件应该以它们包含的公共类命名。


是的,它在 \protected\controllers\SomeController.php 中。顺便说一下,“http://localhost/yii/testapp/index.php?r=some” 是可以工作的... 但是 gii 的 “YetAnotherController.php” (index.php?r=yetAnother) 和我的 “AnotherController.php” (index.php?r=another) 在其基类(SomeController.php)上给出了错误。当 SomeController.php 是基类时,似乎存在自动加载的问题,但如果我使用 index.php?r=some,则可以正常工作。此外,在控制器中引用 Post.php 时,我也遇到了相同的错误... 它在 models/Post.php 中... - Luke Wenke
哦,好的,那么你会从URL访问基础控制器吗?还是它只是一个基类,你只想这样使用它? - bool.dev
对不起,看起来基类应该放在/components/中-我没有正确阅读电子书。 - Luke Wenke
是的,但是这样你就无法从URL中使用它了,为此你必须导入。 - bool.dev
请将以下与编程有关的内容从英语翻译成中文。仅返回翻译后的文本:参见更新,使用控制器作为URL和基类。 - bool.dev
1
这一定是 Yii 最令人恼火的事情之一。 - Andrew Ellis

3

要扩展任何类,只需转到配置文件并在导入部分中添加类

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

这将使其在整个应用程序中可用,无需显式导入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接