4

Yii::$app->runAction('new_controller/new_action', $params);

我相信这可以用来从另一个控制器调用控制器动作。

有没有办法调用驻留在另一个模块中的控制器操作?

就像是:

Yii::$app->runAction('/route/to/other/module/new_controller/new_action', $params);

这可能吗?

4

3 回答 3

3

是的,你可以这么做。但这表明您的体系结构存在问题。当控制器包含复杂的逻辑时,这是不好的做法。

也许您可以将代码的公共部分移入模型并在控制器中将他作为方法调用?还是打电话$this->redirect()代替Yii::$app->runAction()?尽量避免模块的强连接。

更新:
例如这个示例代码不是很好。因为你不能在没有初始化请求的情况下为动作中的逻辑编写单元测试。这是一个非常简单的例子:

class SampleController extends Controller {
    public function actionMyAction() {
        // do thomething
        return $result;        
    }
}

class SampleRestController extends Controller {
    public function actionMyRestAction() {
        return \Yii::$app()->runAction("sample/my-action");
    }
}

但是你可以这样做:

class MyModel { // 
    public function generateResult() {
        // do thomething
        return $result;
    }
}

class SampleController extends Controller {
    public function actionMyAction() {
        return (new MyModel)->generateResult();       
    }
}

class SampleRestController extends Controller {
    public function actionMyRestAction() {
        return (new MyModel)->generateResult();     
    }
}

在这里,您可以调用MyModel::generateResult()不同的操作,并且可以轻松地为此方法编写单元测试。你可以在没有调用的情况下做到这一点runAction()

我并不是说这runAction()很糟糕。但是使用这种方法是反思的机会。

于 2015-10-08T07:04:31.817 回答
1

尝试使用这个。

Yii::$app->runAction('checksheet/index', ['param1' => $param1, 'param2' => $param2]);

做这份工作

于 2017-11-28T11:06:24.730 回答
0

它可能与runAction()模块中的功能。在此处查看文档

于 2015-10-08T06:57:00.770 回答