【问题标题】:Call a controller in another module from another controller从另一个控制器调用另一个模块中的控制器
【发布时间】:2016-01-05 15:36:26
【问题描述】:

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);

标签: controller routes yii2 controller-action


【解决方案1】:

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

也许您可以将代码的公共部分移动到模型中并在控制器中将他作为方法调用?还是打电话给$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 实现都在一个单独的模块中。我想要一种为某些控制器操作调用休息调用的方法。这是一个糟糕的设计吗?我应该怎么做才能使它正确
【解决方案2】:

尝试使用它。

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

做这个工作

【讨论】:

    【解决方案3】:

    可以使用模块中的函数runAction()。检查documentation here

    【讨论】:

      猜你喜欢
      • 2015-09-07
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多