Выполнение миграции RBAC вместе с другими миграциями

Обсуждение документации второй версии фреймворка. Переводы Cookbook и авторские рецепты.
Ответить
Аватара пользователя
pr_o
Сообщения: 65
Зарегистрирован: 2010.01.19, 02:20

Выполнение миграции RBAC вместе с другими миграциями

Сообщение pr_o »

Для того, что бы выполнить миграцию в методе up/down другой миграции, нужно написать следующий код:

Код: Выделить всё

Yii::$app->runAction('migrate/up', ['migrationPath' => '@yii/rbac/migrations', 'interactive' => false]); 
Если честно - копался полтора часа в коде, что бы понять как это сделать... Я думаю, что таким образом встроенные в yii2 миграции легче подтягивать обычной командой для миграций.
Пример для наглядности, как это использовать:

Код: Выделить всё

<?php

use yii\db\Migration;

class m151124_160533_rbac extends Migration
{
    public function up()
    {
        Yii::$app->runAction('migrate/up', [
            'migrationPath' => '@yii/rbac/migrations',
            'interactive' => false, // таким образом мы всегда говорим yes на все запросы в консоли
        ]);
    }

    public function down()
    {
        echo "m151124_160533_rbac cannot be reverted.\n";

        Yii::$app->runAction('migrate/down', [
            'migrationPath' => '@yii/rbac/migrations',
            'interactive' => false,
        ]);

        return false;
    }
}
UPD 1 При migrate/down будут вылазить ошибки, связанные с путями :(

UPD 2 Получилось реализовать поставленную задачу способом, описанным здесь: https://mdmunir.wordpress.com/2014/10/2 ... iple-path/.

1. Создаем контроллер для консоли @app/commands/MigrateController.php

Код: Выделить всё

<?php

namespace app\commands;

use Yii;
use yii\helpers\ArrayHelper;

/**
 * Description of MigrateController
 *
 * @author Misbahul D Munir <misbahuldmunir@gmail.com>
 */
class MigrateController extends \yii\console\controllers\MigrateController
{
    /**
     * @var array
     */
    public $migrationLookup = [];

    /**
     * @var array
     */
    private $_migrationFiles;

    protected function getMigrationFiles()
    {
        if ($this->_migrationFiles === null) {
            $this->_migrationFiles = [];
            $directories = array_merge($this->migrationLookup, [$this->migrationPath]);
            $extraPath = ArrayHelper::getValue(Yii::$app->params, 'yii.migrations');
            if (!empty($extraPath)) {
                $directories = array_merge((array) $extraPath, $directories);
            }

            foreach (array_unique($directories) as $dir) {
                $dir = Yii::getAlias($dir, false);
                if ($dir && is_dir($dir)) {
                    $handle = opendir($dir);
                    while (($file = readdir($handle)) !== false) {
                        if ($file === '.' || $file === '..') {
                            continue;
                        }
                        $path = $dir . DIRECTORY_SEPARATOR . $file;
                        if (preg_match('/^(m(\d{6}_\d{6})_.*?)\.php$/', $file, $matches) && is_file($path)) {
                            $this->_migrationFiles[$matches[1]] = $path;
                        }
                    }
                    closedir($handle);
                }
            }

            ksort($this->_migrationFiles);
        }

        return $this->_migrationFiles;
    }

    protected function createMigration($class)
    {
        $file = $this->getMigrationFiles()[$class];
        require_once $file;

        return new $class(['db' => $this->db]);
    }

    protected function getNewMigrations()
    {
        $applied = [];
        foreach ($this->getMigrationHistory(null) as $version => $time) {
            $applied[substr($version, 1, 13)] = true;
        }

        $migrations = [];
        foreach ($this->getMigrationFiles() as $version => $path) {
            if (!isset($applied[substr($version, 1, 13)])) {
                $migrations[] = $version;
            }
        }

        return $migrations;
    }
}
 
2. Привязываем контроллер к команде ./yii migrate. В конфигах для консоли (чаще всего console.php) прописываем:

Код: Выделить всё

    'controllerMap' => [
        'migrate' => [
            'class' => 'app\commands\MigrateController',
        ],
    ],
 
3. Прописываем пути для миграций(то, что нам нужно!) в параметрах (чаще всего файл params.php), которые подключаются к конфигам консоли:

Код: Выделить всё

    'yii.migrations' => [
        "@app/migrations",
        "@yii/rbac/migrations",
    ],
 
4. Пользуемся стандартными командами для миграций: ./yii migrate/up, ./yii migrate/down

Всем спасибо. Если есть какие-то замечания, пишите! Буду раз обсудить :D
Последний раз редактировалось pr_o 2015.11.25, 13:56, всего редактировалось 5 раз.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Выполнение миграции RBAC вместе с другой миграцией

Сообщение ElisDN »

Ну а какой смысл? Не легче ли просто отнаследоваться?
Аватара пользователя
pr_o
Сообщения: 65
Зарегистрирован: 2010.01.19, 02:20

Re: Выполнение миграции RBAC вместе с другой миграцией

Сообщение pr_o »

ElisDN писал(а):Ну а какой смысл? Не легче ли просто отнаследоваться?
А если при обновлении в миграциях (@yii/rbac/migrations) что-то поменяется и там будет пару файлов (2 класса)?
Аватара пользователя
pr_o
Сообщения: 65
Зарегистрирован: 2010.01.19, 02:20

Re: Выполнение миграции RBAC вместе с другой миграцией

Сообщение pr_o »

Еще я заметил, что при выполнении

Код: Выделить всё

Yii::$app->runAction('migrate/down', [
    'migrationPath' => '@yii/rbac/migrations',
    'interactive' => false,
]);
Параметр "migrationPath" срабатывает, но потом он каким-то магическим образом запоминается..
Последний раз редактировалось pr_o 2015.11.25, 12:22, всего редактировалось 1 раз.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Выполнение миграции RBAC вместе с другой миграцией

Сообщение zelenin »

а как откатываться? имхо, мы тут применяем какой-то хак, который рушит всю философию миграций
Аватара пользователя
pr_o
Сообщения: 65
Зарегистрирован: 2010.01.19, 02:20

Re: Выполнение миграции RBAC вместе с другой миграцией

Сообщение pr_o »

zelenin писал(а):а как откатываться? имхо, мы тут применяем какой-то хак, который рушит всю философию миграций
А как одной миграцией выполнить миграции и с директории '@yii/rbac/migrations' и с директории '@app/migrations'? При чем выполняется только команда "shell> ./yii migrate" на деплое и я никак повлиять не могу..

В принципе может помочь команда shell_exec, но это не выход, как по мне..
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Выполнение миграции RBAC вместе с другой миграцией

Сообщение zelenin »

pr_o писал(а):
zelenin писал(а):а как откатываться? имхо, мы тут применяем какой-то хак, который рушит всю философию миграций
А как одной миграцией выполнить миграции и с директории '@yii/rbac/migrations' и с директории '@app/migrations'?
я написал свой migratecontroller, который бегает по заданным папкам. у многих такой есть. есть и на гитхабе.
Аватара пользователя
pr_o
Сообщения: 65
Зарегистрирован: 2010.01.19, 02:20

Re: Выполнение миграции RBAC вместе с другой миграцией

Сообщение pr_o »

zelenin писал(а):я написал свой migratecontroller, который бегает по заданным папкам. у многих такой есть. есть и на гитхабе.
Ну не знаю, хочется, что бы все работало стандартно..
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Выполнение миграции RBAC вместе с другой миграцией

Сообщение zelenin »

pr_o писал(а):
zelenin писал(а):я написал свой migratecontroller, который бегает по заданным папкам. у многих такой есть. есть и на гитхабе.
Ну не знаю, хочется, что бы все работало стандартно..
ну когда поймете, что ваш вариант просто хак, а не рабочий инструмент, тогда продолжим)
Аватара пользователя
pr_o
Сообщения: 65
Зарегистрирован: 2010.01.19, 02:20

Re: Выполнение миграции RBAC вместе с другой миграцией

Сообщение pr_o »

zelenin писал(а):ну когда поймете, что ваш вариант просто хак, а не рабочий инструмент, тогда продолжим)
Спасибо, учту ;)
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Выполнение миграции RBAC вместе с другой миграцией

Сообщение ElisDN »

Для ковровой бомбардировки по нескольким папкам есть, например, yii2-migrate-command.

А из коробки - уже два с половиной года воз и ныне там.
Аватара пользователя
pr_o
Сообщения: 65
Зарегистрирован: 2010.01.19, 02:20

Re: Выполнение миграции RBAC вместе с другой миграцией

Сообщение pr_o »

Получилось сделать другим способом. Смотрите UPD 2 в главном сообщении темы.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Выполнение миграции RBAC вместе с другой миграцией

Сообщение zelenin »

pr_o писал(а):Получилось сделать другим способом. Смотрите UPD 2 в главном сообщении темы.
viewtopic.php?p=172934#p172913
viewtopic.php?p=172934#p172918
amarox
Сообщения: 78
Зарегистрирован: 2012.03.19, 21:03

Re: Выполнение миграции RBAC вместе с другой миграцией

Сообщение amarox »

ElisDN писал(а): 2015.11.25, 12:49 Для ковровой бомбардировки по нескольким папкам есть, например, yii2-migrate-command.

А из коробки - уже два с половиной года воз и ныне там.
За dmstr/yii2-migrate-command отдельное спасибо! Давно искал нечто подобное
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Выполнение миграции RBAC вместе с другой миграцией

Сообщение rugabarbo »

amarox писал(а): 2017.04.08, 15:28
ElisDN писал(а): 2015.11.25, 12:49 Для ковровой бомбардировки по нескольким папкам есть, например, yii2-migrate-command.

А из коробки - уже два с половиной года воз и ныне там.
За dmstr/yii2-migrate-command отдельное спасибо! Давно искал нечто подобное
Начиная с 2.0.10, не нужен он уже вроде: https://github.com/yiisoft/yii2/commit/ ... 808b48f7a3
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Выполнение миграции RBAC вместе с другой миграцией

Сообщение ElisDN »

rugabarbo писал(а): 2017.04.08, 15:43 Начиная с 2.0.10, не нужен он уже вроде
Нужен. Там сделали только по неймспейсам.
Ответить