Yii 1.x控制器须继承CController、动作方法以action开头且为public,文件位于protected/controllers/下并严格匹配类名大小写;参数用getParam()获取,跳转用redirect(),渲染用render();常见404因缺少action前缀、调试未开启或文件权限问题。

Yii 1.x 的控制器必须继承 CController,且动作方法名必须以 action 开头,否则路由找不到、404 直接报给你看。
控制器文件位置和命名规则
控制器类文件必须放在 protected/controllers/ 目录下,文件名与类名严格对应,且首字母大写、后缀为 Controller:
-
PostController.php→ 类名必须是PostController -
UserAdminController.php→ 类名必须是UserAdminController - 不能叫
postController.php或Postcontroller.php,大小写错一个就加载失败 - 类定义前无需
namespace(Yii 1.x 不用命名空间)
action 方法的写法和访问限制
所有可被 URL 路由调用的方法,必须是 public、以 action 开头、驼峰命名,并且不能带参数:
- ✅ 正确:
public function actionView()、public function actionCreatePost() - ❌ 错误:
public function view()(没action前缀)、private function actionIndex()(非 public)、public function actionEdit($id)(带参数,Yii 1.x 不允许) - 参数必须通过
$_GET或$this->createUrl()生成的 URL 传入,再用$this->getParam('id')取 - 若想禁止外部访问某个方法,改用
protected function doSomething(),不加action前缀即可
控制器里怎么取 GET/POST 参数和跳转
别直接碰 $_GET 或 $_POST —— Yii 提供了更安全、可过滤的封装:
- 取参数:
$this->getParam('name')(等价于isset($_GET['name']) ? $_GET['name'] : null),支持默认值:$this->getParam('page', 1) - 验证并取整数:
$id = (int)$this->getParam('id');,但更推荐用CVarDumper::dump()先看结构再处理 - 跳转到其他动作:
$this->redirect(array('post/view', 'id'=>123)),注意数组第一个元素是路由字符串,不是方法名 - 渲染视图:
$this->render('view', array('model'=>$model)),视图文件路径自动映射到protected/views/post/view.php
常见 404 和空白页原因
控制器写完跑不起来?大概率卡在这几个点上:
- URL 是
/index.php?r=post/index,但控制器叫PostController,方法叫actionIndex—— 少了action前缀就 404 - 入口文件没开调试模式:
defined('YII_DEBUG') or define('YII_DEBUG', true);注释掉了,错误全被吃掉,页面就空白 -
protected/controllers/下控制器文件权限不对,或 PHP 无法读取(尤其部署到 Linux 时) - 控制器里抛了异常但没配置
errorHandler组件,导致白屏无提示
最省事的排查方式:在控制器构造函数里加 die('here');,能输出说明类加载成功,问题出在动作方法或路由上。











