从另一个控制器调用另一个模块中的控制器

时间:2015-10-08 06:51:40

标签: controller routes yii2 controller-action

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

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

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

类似的东西:

bfSize = biSizeImage + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) bfSize = biSizeImage + 54 // since BITMAPFILEHEADER = 40 and BITMAPINFOHEADER = 14 biSizeImage = (biWidth * sizeof(RGBTRIPLE) + padding) * abs(biHeight)

这可能吗?

3 个答案:

答案 0 :(得分: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()不好。但使用这种方法是值得反思的。

答案 1 :(得分:1)

尝试使用它。

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

这份工作

答案 2 :(得分:0)

可以使用Module中的函数runAction()。查看documentation here