MasterGerold
@MasterGerold

Как перенаправить вывод используя Yii runAction?

Доброго времени суток! У меня есть action "actionAddSuperAdmin" в нём я создаю пользователя в одной базе данных и на основе его данных создаю ему его, так сказать, базу данных и если она успешно создана, то я применяю к ней миграции, вот кусок кода:
try {
    $sql = Yii::$app->db->createCommand('CREATE DATABASE ' . $db_name)->execute();
    if ($sql) {
        \Yii::$app->runAction('user/migrate', ['db_name' => $db_name]);
    }
} catch (Exception $e) {
    return $this->asJson(['success' => false, 'errors' => json_encode($e)]);
}

return $this->asJson($response);

Вот сам метод, который вызывается после успешного создания базы:
public function actionMigrate($db_name)
{
    // https://github.com/yiisoft/yii2/issues/1764#issuecomment-42436905
    $oldApp = \Yii::$app;
    new \yii\console\Application([
        'id' => 'Command runner',
        'basePath' => '@console',
        'components' => [
            'db' => [
                'class' => 'yii\db\Connection',
                'dsn' => 'mysql:host=localhost;dbname=' . $db_name . '',
                'username' => 'root',
                'password' => '',
                'charset' => 'utf8',
            ],
        ],
    ]);
    \Yii::$app->runAction('migrate/up',
        ['migrationPath' => '@console/migrations', 'interactive' => false]);
    \Yii::$app = $oldApp;
}

Но после его выполнения ответ от сервера не тот что мне надо:
> create table {{%user}} ... done (time: 0.366s) > create index idx-user-subdomain on user (subdomain) ... done (time: 0.114s) ... и так все таблицы

И в конце:
Exception 'yii\web\HeadersAlreadySentException' with message 'Headers already sent in E:\OSPanel\domains\order.loc\vendor\yiisoft\yii2\db\Migration.php on line 577.' in E:\OSPanel\domains\order.loc\vendor\yiisoft\yii2\web\Response.php:366 Stack trace: #0 E:\OSPanel\domains\order.loc\vendor\yiisoft\yii2\web\Response.php(339): yii\web\Response->sendHeaders() #1 E:\OSPanel\domains\order.loc\vendor\yiisoft\yii2\base\Application.php(392): yii\web\Response->send() #2 E:\OSPanel\domains\order.loc\frontend\web\index.php(38): yii\base\Application->run() #3 {main}

Что сделать чтобы этого вывода не было, а был тот что идёт дальше по коду (то есть "return $this->asJson($response);")?
Заранее спасибо за ответы!
  • Вопрос задан
  • 145 просмотров
Решения вопроса 1
@sidni
Php Developer
Буферизация вывода
ob_start();

// Вызов вашего метода
 
// если необходимо сохраняем всё что есть в буфере в переменную
$content = ob_get_contents();
 
// отключаем и очищаем буфер
ob_end_clean();
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы