2015-10-08 259 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]); 

做工作