2015-10-08 64 views
3

Yii::$app->runAction('new_controller/new_action', $params);从另一个控制器

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

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

喜欢的东西:

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

这可能吗?

+0

yes..it的可能。 –

+0

只需使用'return Yii :: $ app-> runAction('/ route/to/other/module/new_controller/new_action',$ params);'。 –

回答

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()是坏的。但是使用这种方法有时会反映出来。

+0

所有Rest Api实现都在一个单独的模块中。我想要一种方法来调用一些控制器动作的休息调用。这是一个糟糕的设计?我应该怎么做才能做到这一点 – DGT

+0

@DGT我为您的案例添加了代码示例。 –

0

试着使用它。

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

做工作