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

4

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

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

是否有一种方法可以调用位于另一个模块中的控制器动作?

类似于:

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

这可能吗?


只需使用 return Yii::$app->runAction('/route/to/other/module/new_controller/new_action', $params); - Insane Skull
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()是不好的。但使用这种方法需要深思熟虑。

所有的Rest API实现都在一个单独的模块中。我想要一种方式来调用某个控制器动作的rest请求。这是不好的设计吗?我应该怎么做才能使它正确呢? - DGT

1

试着使用这个。

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

完成工作


0

在模块中,使用函数runAction()可以实现。请查看此处的文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接