Вызов контроллера в другом модуле из другого контроллера

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

Я считаю, что это можно использовать для вызова действия контроллера из другого контроллера.

Есть ли способ вызвать действие контроллера, которое находится в другом модуле?

Что-то вроде:

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() плохо. Но использование этого метода дает повод задуматься.

Попробуйте использовать это.

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

Делает работу

Это возможно с функцией runAction() в модуле. Проверьте документацию здесь

Другие вопросы по тегам