Skip to main content

一个控制器调用其他控制器action的方法

一个控制器调用其他控制器action的方法:

Yii::$app->runAction('new_controller/new_action', $params); // 或者 return (new SecondController('second', Yii::$app->module))->runAction('index', $data);

传参数

我们先来看一段代码

class RaController extends Controller {

public $enableCsrfValidation = false;

public function actionSay($username = '',$city = ''){
echo "{$username} 来自 {$city}";
}
}

这里actionSay对应的url为index.php?r=ra/say,而 $username 和 $city 值的获取来自于url的参数,比如

index.php?r=ra/say&username=abei2017&city=洛阳

总结 在yii2中,action参数都是来自于GET。

但是有的时候你可能需要让action的参数来自于POST请求,怎么办?

重载runAction即可,yii2为控制器提供了runAction方法,它负责生成一个具体的Action对象并传递参数,我们可以通过复写它来实现,你可以看下yii2的生命周期来对其进行更好的了解。

那就开始干吧~,对上面的代码复写runAction

class RaController extends Controller {

public $enableCsrfValidation = false;

public function runAction($id, $params = []){
$params = ArrayHelper::merge(Yii::$app->request->post(),$params);
return parent::runAction($id, $params);
}

public function actionSay($username = '',$city = ''){
echo "{$username} 来自 {$city}";
}
}

复写了runAction后,它将作用于此控制器的所有action,当然你也可以通过runAction的$id来作用于某个action。比如

public function runAction($id, $params = []){
if($id == 'say'){
$params = ArrayHelper::merge(Yii::$app->request->post(),$params);
}

return parent::runAction($id, $params);
}

现在去试试吧,对say动作提交POST数据username和city,成功接收。