kradwhite
@kradwhite
https://github.com/kradwhite

Yii2. Отдельностоящие Миграции. Почему цепляются неуказанные миграции?

common/config/main.php
return [
    'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
    'components' => [
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
    ],

    'bootstrap' => [
        'user-manager',
    ],

    'modules' => [
    	'user-manager' => [
    		'class' => 'common\modules\UserManager\Module',
            'plugins' => ['profile'],
    	],
    ],

    'controllerMap' => [
        'migrate-app' => [
            'class' => 'yii\console\controllers\MigrateController',
            //'migrationNamespaces' => [''],
            'migrationTable' => 'migration',
        ],
    ],
];


common/modules/UserManager/Module.php
class Module extends \yii\base\Module
{
    public $plugins = [];

    /**
     * @inheritdoc
     */
    public $controllerNamespace = 'common\modules\UserManager\controllers';

    /**
     * @inheritdoc
     */
    public function init()
    {
        parent::init();

        $plugins = [];
        if(isset($this->plugins) && !empty($this->plugins)){
            $this->plugins = array_flip($this->plugins);
            
            if(isset($this->plugins['profile'])){
                $plugins['profile'] = [
                    'class' => 'common\modules\UserManager\modules\Profile\Module'
                ];
            }
        }
        $this->modules = $plugins;
        if(\Yii::$app instanceof \yii\console\Application){
            $migName[] = 'common\modules\UserManager\migrations';
            if(isset($this->plugins['profile'])){
                $migName[] = 'common\modules\UserManager\modules\Profile\migrations';
            }

            \Yii::$app->controllerMap['migrate-user-manager'] = [
                'class' => 'yii\console\controllers\MigrateController',
                'migrationNamespaces' => $migName,
                'migrationTable' => 'migration_user_manager',
            ];
        }
    }
}


При команде в консоли:
./yii migrate-user-manager
Yii предлогает исполнить все миграции и даже те которые не указаны для данной команды.
Yii Migration Tool (based on Yii v2.0.11.2)

Total 3 new migrations to be applied:
	m130524_201442_init
	common\modules\UserManager\migrations\m170424_124532_user_manager_init
	common\modules\UserManager\modules\Profile\migrations\m170502_154236_user_manager_profile

Apply the above migrations? (yes|no) [no]:n

Почему так происходит и как это исправить?
  • Вопрос задан
  • 1495 просмотров
Пригласить эксперта
Ответы на вопрос 2
qonand
@qonand
Software Engineer
ох что-то Вы на мудрили. Почитайте лучше тут как организовать отдельностоящие миграции
Ответ написан
kradwhite
@kradwhite Автор вопроса
https://github.com/kradwhite
Залез в исходники и нашел что в классе BaseMigrateController migrationNamespace преобразуются в пути к папкам с файлами миграций и сливаются в один массив с migrationPath(который по умолчанию равен '@app/migrations'). И соответственно цепляются все миграции из этой папки в одной куче с миграциями пространства имен. И если у вас разные таблицы под хранение миграций модуля и приложения, то миграции из папки по умолчанию считаются не выполнеными. Либо они забыли проверку добавить не использовать migrationPath, если указаны migrationNamspace, либо это было сделано намерено по каким то причинам. Не буду дальше разбираться...
Средство лечения добавить в конфиг команды migrationPath => null.
Получается вот так это выглядит:
'controllerMap' => [
        'migrate-module' => [
            'class' => 'yii\console\controllers\MigrateController',
            'migrationNamespaces' => [
                'namespace\from\module',
                'namespace\another'
            ],
            'migrationTable' => 'migration_module',
            'migrationPath' => null,
        ],
    ],
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы