独立action必须在actions()方法中显式注册,通过键值对配置action id与类名或带参数数组;run()方法参数决定url查询参数绑定规则,且erroraction需在config/web.php中配置,与控制器actions()无关。

独立Action必须在 actions() 方法里返回配置数组
独立Action不是靠自动扫描或命名约定生效的,必须显式注册。控制器里要定义 actions() 方法,返回一个键值对数组,key 是 action ID(比如 test),value 是类名字符串或带配置的数组。
- 类名字符串写法:
'test' => 'frontend\libs\TestAction' - 带参数写法:
'test' => ['class' => 'frontend\libs\TestAction', 'param1' => 'hello']—— 这些属性会自动注入到 Action 实例的同名 public 属性上 - 如果类不在自动加载路径下,得确认
composer dump-autoload已执行,或手动 require
run() 方法签名决定 URL 参数怎么传
独立Action的 run() 方法参数决定了哪些值能从 URL query string 直接接收。比如 public function run($id = null, $type = 'default'),访问 ?r=site/test&id=123&type=api 就会把值自动绑定过去。
- 只声明
run()(无参):URL 里传的任何 query 参数都会被忽略 - 声明
run($a, $b):URL 必须带a=和b=,缺一不可,否则报 400 错误 - 声明
run($id = null):id是可选的,不传也不报错 - 注意:query 参数名必须和
run()的形参名完全一致,大小写敏感
别把 errorAction 配错位置,它和独立Action无关
很多人混淆 errorAction 和控制器里的 actions()。前者是全局错误处理路由,只能在 config/web.php 的 'errorHandler' => ['errorAction' => 'site/error'] 里设;后者只是当前控制器的 action 映射表。
- 把
'errorAction' => 'site/error'写进控制器的actions()数组里——完全无效 - 把
'error' => ['class' => 'yii\web\ErrorAction']放进actions()—— 这是合法的独立Action,但它和全局错误页无关,只是个普通路由site/error - 真正控制 500/404 页面的是 errorHandler 组件,不是 controller 行为
视图渲染路径由控制器决定,不是 Action 类决定
独立Action里调用 $this->controller->render('xxx') 时,视图文件路径是 @app/views/{当前控制器ID}/xxx.php,和 Action 类放在哪、叫什么名字毫无关系。
- 比如
SiteController里配了'test' => 'frontend\libs\TestAction',那render('test')就去找@app/views/site/test.php - 想复用视图?直接写完整路径:
$this->controller->render('@app/views/common/layout') - Action 类里不能直接用
$this->render()(它没这个方法),必须通过$this->controller
run() 方法参数与 URL 的严格对应关系,以及把 errorAction 当成普通 action 去配。这两处一错,调试时根本不会进断点,连日志都看不到。











