2017-02-05 17 views
3

Я знаю, что могу бежать бен/торт Миграции мигрировать --plugin MyPluginКак я могу запустить все миграции для всех плагинов в cakephp 3?

, но я использую 50 + плагины в моем проекте и ид любил запускать все миграции во всех плагинов с помощью одной команды это возможно?

+0

Просто вручную перебирать плагинов, которые нуждаются в миграции для запуска в вашем deploy.sh скрипта и т.д. – mark

ответ

2

Насколько я знаю, нет прямой forward для запуска миграции для всех плагинов. Однако для этого можно создать простой скрипт Shell.

Вы можете получить список всех загруженных плагинов для приложения с помощью: -

$plugins = Plugin::loaded(); 

Вы можете затем запустить миграцию для каждого плагина, используя dispatchShell, который позволяет запускать команду из другого Shell: -

$this->dispatchShell(
    'migrations', 
    'migrate', 
    '-p', 
    $plugin 
); 

Каждый аргумент для миграции передается в качестве аргумента dispatchShell.

Таким образом, поставив все вместе в сценарий оболочки: -

<?php 
// src/Shell/InstallShell.php 
namespace App\Shell; 

use Cake\Console\Shell; 
use Cake\Core\Plugin; 

class InstallShell extends Shell 
{ 
    public function plugins() 
    { 
     $plugins = Plugin::loaded(); 
     foreach ($plugins as $plugin) { 
      $this->dispatchShell(
       'migrations', 
       'migrate', 
       '-p', 
       $plugin 
      ); 
     } 
    } 
} 

Этот сценарий будет называться как $ bin/cake install plugins.

0

Да возможно есть несколько способов достижения этой записи скрипт и сохранить в каталоге бен со всеми 50 плагинов миграции или вы также можете использовать CakePHP оболочки Апи read here

+0

так что я могу сделать это только путем создания задачи оболочки не с командой бен/торт переселении? – jurrieb

+0

см. Здесь https://book.cakephp.org/3.0/ru/migrations.html#migrate-applying-migrations –

+0

# Запуск всех миграций $ миграция bin/cake migrate –

0

У меня есть улучшенный ответ «drmonkeyninja» со следующим кодом. Таким образом, миграции выполняются только тогда, когда они еще не были перенесены, и они переносятся в порядке времени, указанного в имени файла.

<?php 
// src/Shell/InstallShell.php 
namespace App\Shell; 

use Cake\Console\Shell; 
use Cake\Core\Plugin; 
use Migrations\Migrations; 

class InstallShell extends Shell 
{ 
    public function plugins() 
    { 
     $migrationsClass = new Migrations(); 
     $migrations = []; 
     $pluginMigrations = []; 
     $plugins = Plugin::loaded(); 
     foreach ($plugins as $plugin) { 
      $statuses = $migrationsClass->status(['plugin' => $plugin]); 
      $path = Plugin::path($plugin) . 'config' . DS . 'Migrations' . DS; 
      if (@$handle = opendir($path)) { 
       while (false !== ($entry = readdir($handle))) { 
        if ($entry != "." && $entry != "..") { 
         $timestamp = substr($entry, 0, 14); 
         if(!is_numeric($timestamp)) { 
          continue; 
         } 

         foreach($statuses as $status){ 
          if ($status['status'] == 'up' && $status['id'] === $timestamp) { 
           continue(2); 
          } 
         } 

         $migrations[] = $timestamp; 
         $pluginMigrations[$timestamp] = $plugin; 
        } 
       } 
       closedir($handle); 
      } 
     } 

     sort($migrations); 

     foreach ($migrations as $timestamp) { 
      $this->dispatchShell(
       'migrations', 
       'migrate', 
       '-p', 
       $pluginMigrations[$timestamp], 
       '-t', 
       $timestamp 
      ); 
     } 
    } 
}