2016-06-21 4 views
3

поэтому я создал свой собственный пакет блога в структуре Packages/Sitemanager/Blog У меня есть поставщик услуг, который выглядит следующим образом:Laravel 5 динамически управляют миграции

namespace Sitemanager\Blog; 

use Illuminate\Support\ServiceProvider as LaravelServiceProvider; 

class BlogServiceProvider extends LaravelServiceProvider { 

    /** 
    * Indicates if loading of the provider is deferred. 
    * 
    * @var bool 
    */ 
    protected $defer = false; 

    /** 
    * Bootstrap the application events. 
    * 
    * @return void 
    */ 
    public function boot() { 

     $this->handleConfigs(); 
     $this->handleMigrations(); 
     $this->handleViews(); 
     $this->handleRoutes(); 
    } 

    /** 
    * Register the service provider. 
    * 
    * @return void 
    */ 
    public function register() { 

     // Bind any implementations. 
     $this->app->make('Sitemanager\Blog\Controllers\BlogController'); 
    } 

    /** 
    * Get the services provided by the provider. 
    * 
    * @return array 
    */ 
    public function provides() { 

     return []; 
    } 

    private function handleConfigs() { 

     $configPath = __DIR__ . '/config/blog.php'; 

     $this->publishes([$configPath => config_path('blog.php')]); 

     $this->mergeConfigFrom($configPath, 'blog'); 
    } 

    private function handleTranslations() { 

     $this->loadTranslationsFrom(__DIR__.'/lang', 'blog'); 
    } 

    private function handleViews() { 

     $this->loadViewsFrom(__DIR__.'/views', 'blog'); 

     $this->publishes([__DIR__.'/views' => base_path('resources/views/vendor/blog')]); 
    } 

    private function handleMigrations() { 

     $this->publishes([__DIR__ . '/migrations' => base_path('database/migrations')]); 
    } 

    private function handleRoutes() { 

     include __DIR__.'/routes.php'; 
    } 
} 

Теперь, что я хотел бы сделать, это запустить миграции динамически, если они никогда не выполнялись до или в процессе установки, я полагаю. Я видел в старой документации вы могли так что-то вроде этого:

Artisan::call('migrate', array('--path' => 'app/migrations')); 

Однако это недопустимо в Laravel 5, как я могу подойти к этому?

+0

https://laravel.com/docs/5.2/artisan#calling-commands-via-code –

ответ

8
Artisan::call('migrate', array('--path' => 'app/migrations')); 

будет работать в Laravel 5, но вам, вероятно, придется сделать пару настроек.

Для начала вам понадобится строка use Artisan; в верхней части вашего файла (где use Illuminate\Support\ServiceProvider... есть), из-за пространства имен Laravel 5. (Вы также можете сделать \Artisan::call - важно \).

Вы, вероятно, также необходимо сделать следующее:

Artisan::call('migrate', array('--path' => 'app/migrations', '--force' => true)); 

--force необходимо потому, что Laravel, по умолчанию, предложит вам да/нет в производстве, так как это потенциально разрушительными команда. Без --force ваш код будет просто сидеть там, крутя колеса (Laravel ждет ответа от CLI, но вы не в CLI).

enter image description here

Я призываю вас сделать этот материал где-то другой чем boot метода поставщика услуг. Это могут быть тяжелые вызовы (полагаясь на вызовы файловой системы и базы данных, которые вы не хотите делать на каждом просмотре страницы). Вместо этого рассмотрите явную консольную команду или маршрут.

+0

Используя свою команду загрузки для теперь я, вероятно, захочу иметь какую-то команду установки, которая запускается после установки (не уверенный в лучшем способе сделать это в данный момент). В любом случае, \ Artisan :: call ('migrate', array ('- path' => 'packages/sitemanager/blog/migrations', '--force' => true)); работал для меня, я мог видеть изменения, внесенные в базу данных. Как бы вы сделали процесс установки? и как я могу отменить переход от этого? я бы просто позвонить migrate: rollback to the path? – mdixon18

+2

@ mdixon18 Откат потенциально очень неприятный - я бы не автоматизировал это. [Насколько я знаю] (http://stackoverflow.com/questions/30287896/rollback-one-specific-migration-in-laravel) нет команды Artisan для откат * специфической * миграции, так что вы можете завершить откат неправильный и продувка данных. Я бы выполнил установку с помощью команды консоли Artisan, которую предоставляет ваше приложение. – ceejayoz

+0

Я вижу, как бы я мог загрузить пакет, скажем, контроллер за пределами пакета, я бы просто назвал пространство в классе провайдера и вызвал метод установки? - что он делает для config и views и т. д., что достаточно для публикации пакета? – mdixon18

1

После публикации пакета:

php artisan vendor:publish --provider="Packages\Namespace\ServiceProvider"

Вы можете выполнить миграцию с помощью:

php artisan migrate

Laravel автоматически отслеживает, какие были выполнены и запускает новые соответственно миграции.

Если вы хотите выполнить миграцию из-за пределов CLI, например, на маршруте, вы можете сделать это с помощью Artisan фасада:

Artisan::call('migrate')

Вы можете передать дополнительные параметры, такие как сила и путь как массив ко второму аргументу в Artisan :: call.

Дальнейшее чтение:

Смежные вопросы