🦁
Laravel で old factory を別ディレクトリにする
Laravel 6 以前の昔からあるアプリケーションを 8 以上にした時、使っていた factory が laravel/legacy-factories になるのです。それは良いとして、新 Factory (クラス化されている方)と同じディレクトリにあると、シッチャカメッチャカになるので分けたいなぁってのがあります。その分ける方法のメモ書き。どうやったか自分でも覚えてなかった。
【メモ】古いFactory が既にある状態で新しいクラス化されたFactoryと共存は可能:Laravelのモデルファクトリ 新旧が共存することが可能か検証してみた -- zenn.dev
方法
composer.json
の autoload.classmap
と autoload.psr-4
で切り分ける形。
- composer.json の書き換え。主に
"Database\\Factories\\": "database/factories/"
と"database/legacy-factories"
を加える。
{
"autoload": {
"psr-4": {
"App\\": "app/",
"Database\\Seeders\\": "database/seeders/",
"Database\\Factories\\": "database/factories/"
},
"classmap": [
"database/seeds",
"database/legacy-factories"
]
},
}
-
ディレクトリを変更後、空のディレクトリを作成。
database/factories
を使っており古いFactoryが溜まってるはずです。それをdatabase/legacy-factories
に変えてやります。新しいクラス化されてる Factory がdatabase/factories
に追加されてく形なはずです。空のディレクトリを git add はできないので、.keep
とか置いておくといいと思います。 -
AppServiceProvider に次の数行を追加。これ無いとコケる。忘れてた。
use Faker\Generator;
use Illuminate\Database\Eloquent\Factory;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
// 古い方の factories は legacy-factories に移動したので、追従変更させる
$this->app->singleton(Factory::class, function ($app) {
return Factory::construct(
$app->make(Generator::class), $this->app->databasePath('legacy-factories')
);
});
}
}
- 書き換えた後
composer install --dev
とかをすればいいと思います。
Discussion