2015-12-15 17 views
2

我創建了一個將遷移和種子複製到基本應用程序中相應目錄的包。從包中播種/修復ReflectionException

然而,除非我請(加入),這些在基應用程序中的類DatabaseSeeder(應用程序/數據庫/種子/ DatabaseSeeder.php)當我運行

php artisan migrate:refresh --seed 

然後將種子在run()函數內不跑。我怎樣才能使這部分自動化,以便用戶不必手動編輯這個文件?是否有任何手動命令來手動運行種子?

+0

爲什麼你甚至希望用戶種子/遷移:刷新它似乎不是真正安全的做到這一點。但是您可以將您想要種子的內容轉儲到工作中或在腳本中執行命令。 – Joost

+0

我們公司將項目創建爲包,這樣我們就可以輕鬆地將項目拉到其他項目中,最多隻需一行添加和腳本。我想在基本應用程序中保持一行更改。你指的是什麼命令? – myol

回答

0

仍然不完全明白我是如何得到這個工作,但對於其他人;

在你的PackagenameServiceProvider使用$this->publishes()的種子和遷移轉到基本應用

public function boot() 
{ 
    if (!$this->app->routesAreCached()) { 
     require __DIR__.'/../routes.php'; 
    } 

    $this->publishes([ 
     __DIR__.'/../DatabaseStuff/Migrations' => $this->app->databasePath().'/migrations', 
     __DIR__.'/../DatabaseStuff/Seeds/Example1Seeder.php' => $this->app->databasePath().'/seeds/Example1Seeder.php', 
     __DIR__.'/../DatabaseStuff/Seeds/Example2Seeder.php' => $this->app->databasePath().'/seeds/Example2Seeder.php', 
    ]); 
} 

boot方法有DatabaseSeedercall方法指向的種子要運行,但要確保它的副本名稱間隔正確的位置,以確保您的軟件包中有文件。

namespace ExampleVendor\ExamplePackage\DatabaseStuff; 

use Illuminate\Database\Seeder; 
use Illuminate\Database\Eloquent\Model; 

class DatabaseSeeder extends Seeder 
{ 
    /** 
    * Run the database seeds. 
    * 
    * @return void 
    */ 
    public function run() 
    { 
     Model::unguard(); 

     $this->call(\Example1Seeder::class); 
     $this->call(\Example2Seeder::class); 

     Model::reguard(); 
    } 
} 

現在運行以下命令。在這種情況下關鍵命令對我來說是php artisan optimize

php artisan vendor:publish 

composer dump-autoload 

php artisan cache:clear 

php artisan optimize 

php artisan db:seed --class="ExampleVendor\ExamplePackage\DatabaseStuff\DatabaseSeeder" 

沒有php artisan optimize我一直得到

ReflectionException           
Class ExampleVendor\ExamplePackage\DatabaseStuff\DatabaseSeeder does not exist 

希望這可以幫助別人的未來。