우리는 Laavel의 모형 공장이 신구가 공존할 수 있는지 검증했다
하지만 도구를 사용해서 한꺼번에 수정하기 어려울 때도 있다고 생각해서 나중에 수정할 때 신구 문법이 공존할 수 있는지 검증했습니다.
컨디션
Laravel Sail
로 제작되었습니다.사전 준비
라벨 7 이전의 낡은 모형 공장
laravel/legacy-factories
을 사용하기 위해 미리 포장에 넣는다../vendor/bin/sail composer req laravel/legacy-factories --dev
검증용 모델류를 한층 더 준비한다.이번에는 Laavel의 문서에 적힌 내용을 사용합니다.
app/Models/Flight.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
use HasFactory;
}
검증 1 다른 Eloquent 모델 클래스에 대한 신구 쓰기
새로운 쪽은 원래 있던 User 레벨을 사용합니다.
낡은 건 이걸로.
database/factories/FlightOldFactory.php
<?php
use App\Models\Flight;
use Faker\Generator as Faker;
$factory->define(Flight::class, function (Faker $faker) {
return [
'name' => $faker->name,
];
});
검증 사용tinker
신구 각자의 모델 공장을 집행한다.$ ./vendor/bin/sail artisan tinker
Psy Shell v0.11.2 (PHP 8.1.2 — cli) by Justin Hileman
>>>
>>> use App\Models\User;
>>> $user = User::factory()->make();
=> App\Models\User {#3533
name: "Lew Langosh DDS",
email: "[email protected]",
email_verified_at: "2022-03-26 13:40:50",
#password: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
#remember_token: "Pz9m6zZmuI",
}
>>>
>>> use App\Models\Flight;
>>> $flight = factory(Flight::class)->make();
=> App\Models\Flight {#3527
name: "Dr. Zetta Kilback",
}
>>>
검증 2 동일한 Eloquent 모델 유형의 신구 쓰기 모드 1
새로운 쪽에서 이걸 사용해요.
database/factories/FlightFactory.php
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Flight>
*/
class FlightFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition()
{
return [
'name' => $this->faker->name,
];
}
}
낡은 것은 방금 사용한 내용을 사용한다.그러나 새로운 쪽은 다음과 같은 조건[1]이 있기 때문에 낡은 쪽의 파일 이름을 별명으로 변경한다.
Database\Factories
에 있음モデル名 + Factory
database/factories/FlightFactory.php
↓
database/factories/FlightOldFactory.php
검증은 아까와 마찬가지로 tinker
를 사용하여 신구 각자의 모델 공장을 집행한다.$ ./vendor/bin/sail artisan tinker
Psy Shell v0.11.2 (PHP 8.1.2 — cli) by Justin Hileman
>>>
>>>
>>> use App\Models\Flight;
>>> $flight = Flight::factory()->make();
=> App\Models\Flight {#3532
name: "Lora Gorczany",
}
>>> $flight = factory(Flight::class)->make();
=> App\Models\Flight {#3496
name: "King Cole DVM",
}
>>>
검증 3 동일한 Eloquent 모델 유형의 신구 쓰기 모드 2
문서
HasFactory
를 읽고 TRAITnewFactory
방법을 다시 쓰고 위상류 실례를 되돌려주는 것으로 변경하면 검증2의 새로운 위상류 명명 규칙이 적용되지 않습니다.이 경우 옛 공장의 파일 이름을 변경할 필요가 없다.
app/Models/Flight.php
use Database\Factories\NewFactory\FlightFactory;
~~~~~~~~省略~~~~~~~~
protected static function newFactory()
{
return new FlightFactory();
}
그런 다음 공장 클래스$model
속성에 Eloquent 모델 클래스를 지정해야 합니다.database/factories/NewFactory/FlightFactory.php
<?php
namespace Database\Factories\NewFactory;
use App\Models\Flight;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Flight>
*/
class FlightFactory extends Factory
{
protected $model = Flight::class; // これを追加
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition()
{
return [
'name' => 'aaa',
];
}
}
$ ./vendor/bin/sail artisan tinker
Psy Shell v0.11.2 (PHP 8.1.2 — cli) by Justin Hileman
>>>
>>>
>>> use App\Models\Flight;
>>> $flight = Flight::factory()->make();
=> App\Models\Flight {#3529
name: "aaa",
}
>>> $flight = factory(Flight::class)->make();
=> App\Models\Flight {#3528
name: "Dr. Ezra Stroman",
}
>>>
결실
3개를 검증해 보았지만
laravel/legacy-factories
포장을 사용하면 신구 기법이 공존할 수 있을 것 같다.따라서 이후부터는 착실하게 수정할 수 있지만
laravel/legacy-factories
포장이 어느 버전의 라벨을 지원할지 모르니 빨리 수정하는 것이 좋다.※ 라벨9 지원[2]
각주
https://laravel.com/docs/9.x/database-testing#factory-and-model-discovery-conventions ↩︎
https://github.com/laravel/legacy-factories/pull/13 ↩︎
Reference
이 문제에 관하여(우리는 Laavel의 모형 공장이 신구가 공존할 수 있는지 검증했다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/naopusyu/articles/e3e8d010c4e245텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)