우리는 Laavel의 모형 공장이 신구가 공존할 수 있는지 검증했다

19871 단어 LaravelPHPtech
라벨8에서 모델 공장은 반을 기반으로 다시 쓰여졌고, 쉽게 수정하기 위해 예전에 이런 기사를 쓴 적이 있다.
https://zenn.dev/naopusyu/articles/cc68a0aa827bca
하지만 도구를 사용해서 한꺼번에 수정하기 어려울 때도 있다고 생각해서 나중에 수정할 때 신구 문법이 공존할 수 있는지 검증했습니다.

컨디션

  • PHP 8.1.2
  • Laravel 9.5.1
  • 환경은 Laravel Sail로 제작되었습니다.

    사전 준비


    라벨 7 이전의 낡은 모형 공장laravel/legacy-factories을 사용하기 위해 미리 포장에 넣는다.
    https://github.com/laravel/legacy-factories
    ./vendor/bin/sail composer req laravel/legacy-factories --dev
    
    검증용 모델류를 한층 더 준비한다.
    이번에는 Laavel의 문서에 적힌 내용을 사용합니다.
    https://laravel.com/docs/9.x/eloquent#generating-model-classes
    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 ↩︎

    좋은 웹페이지 즐겨찾기