orangehill/iseedとは
こちらのライブラリ
https://github.com/orangehill/iseed
DBデータからシーダーを生成してくれるというものです
データベースからLaravelのSeederを逆生成する
が、しかし、、
orangehill/iseedが動かない...!!!
Laravel7.x以前だと、
実行するとそんなディレクトリ無いよと言われてしまう。。
# php artisan iseed tests
ErrorException : file_put_contents(/var/www/html/test/database/seeders/TestsTableSeeder.php): failed to open stream: No such file or directory
# ↑ そんなディレクトリ無いよ!僕は知らんへんよ! というエラー
どうすれば?
Laravel8.xを境にシーダーディレクトリ名が変わったことが原因
- Laravel8.x以降:database/seeders
https://laravel.com/docs/8.x/seeding - Laravel7.xまで:database/seeds
https://laravel.com/docs/7.x/seeding
config配下に個別の設定ファイルを作ってあげればおk!
<?php
// vendor\orangehill\iseed\src\config\config.php の設定上書き
return array(
'path' => '/database/seeds', // シーダーディレクトリ名を実態と合わせる
'chunk_size' => 500
);
再実行
# php artisan iseed tests
File TestsTableSeeder.php already exist. Do you wish to override it? [yes|no] (yes/no) [no]:
> yes
Created a seed file from table tests
無事成功!!!
原因判明~対応策発見まで
orangehill/iseedのソースを見ると、
シーダーディレクトリ名が特定バージョンから変わっていた
https://github.com/orangehill/iseed/commit/cc311c44dc2976ed7ebf9b9cf6308453c8149180
oh,no...でも流石に決め打ちにはなってないっしょ。。!
という仮説(願い)を胸に関連ソースを見ていると、
設定ファイルを別途設ければそちらに沿って動作するようになっていた!
https://github.com/orangehill/iseed/blob/master/src/Orangehill/Iseed/IseedServiceProvider.php#L66-L78
/**
* Register the package resources.
*
* @return void
*/
protected function registerResources()
{
$userConfigFile = app()->configPath().'/iseed.php';
$packageConfigFile = __DIR__.'/../../config/config.php';
$config = $this->app['files']->getRequire($packageConfigFile);
if (file_exists($userConfigFile)) { // アプリケーション側のconfigにiseed.phpがあればそれを読み込んでるっぽい
$userConfig = $this->app['files']->getRequire($userConfigFile);
$config = array_replace_recursive($config, $userConfig);
}
$this->app['config']->set('iseed::config', $config);
}
まとめ
- ライブラリ側のエラーだったとしても、以外に簡単に解決できることもある
- ライブラリのソースも臆せずガリガリ読む!