최근에 Laravel 7에서 UUID(Universal Unique Identifier)를 구현해야 했고 몇 가지 문제가 발생했습니다. 이 포스팅이 같은 일을 하고 있는 다른 분들에게도 도움이 되었으면 좋겠습니다.
UUID를 사용하는 고급 이유
A) 이는 URL에서 번호가 붙은 식별자를 제거하므로 사용자는 애플리케이션에서 생성한 특정 개체 수를 볼 수 없습니다. 예:
https://myapp.com/api/users/5
대:
https://myapp.com/api/users/0892b118-856e-4a15-af0c-66a3a4a28eed
B) 식별 번호를 추측하기가 훨씬 더 어렵습니다. 이는 보안에 좋지만 이를 방지하기 위해 다른 기술을 구현해야 할 수도 있습니다.
UUID를 기본 키로 구현
데이터베이스 마이그레이션 변경 방법
먼저, 데이터베이스 마이그레이션에서 현재 자동 증가 ID 필드를 UUID로 바꾸고 싶습니다. 다음 접근 방식을 따를 수도 있습니다. 자동 증가 ID를 유지하고 사용자에게 URL이 표시될 때 사용할 테이블의 추가 필드로 UUID를 사용합니다(이 경우 ID를 모델에 숨깁니다). 여기서는 우리가 할 수 있는 일이 아닙니다. 가상의 직원 테이블이 어떻게 생겼는지 살펴보겠습니다.
public function up() { Schema::create('employees', function (Blueprint $table) { $table->uuid('id')->primary; $table->string('name'); $table->string('email')->unique(); $table->string('work_location')->nullable(); $table->timestamps(); }); }
여기서 일반 id()를 uuid()로 바꾸고 이를 기본 키로 설정했습니다.
이것을 특성으로 만들어 보겠습니다
다음으로 이 모델의 새 인스턴스가 생성될 때 UUID가 할당되도록 Laravel 수명 주기 후크를 구현할 수 있습니다. 모델에서 직접 코드를 작성할 수 있지만 여러 모델에서 UUID를 사용하려는 경우 Traits를 사용하는 것이 좋습니다(이 Dev 기사에서 이 내용을 배웠습니다. Dev에게 정말 감사드립니다). 특성을 사용하면 기본적으로 기능을 생성하고 여러 모델에서 사용하기 위해 use 키워드를 통해 호출할 수 있습니다.
새 특성을 생성하려면 AppHttpTraits 폴더를 생성하고(이것은 단지 내 취미이므로 다른 곳에 둘 수 있습니다) 해당 특성에 대한 새 파일을 생성합니다. UsesUuid.php 파일을 호출하겠습니다.
특징의 특정 코드는 다음과 같습니다.
<?php namespace App\Http\Traits; use Illuminate\Support\Str; trait UsesUuid { protected static function bootUsesUuid() { static::creating(function ($model) { if (! $model->getKey()) { $model->{$model->getKeyName()} = (string) Str::uuid(); } }); } public function getIncrementing() { return false; } public function getKeyType() { return 'string'; } }
UUID를 쉽게 생성하려면 IlluminateSupportStr을 사용하세요. getIncrementing() 메소드는 모델의 기본 키가 증가하지 않을 것임을 Laravel에 알려주며(왜냐하면 false로 설정했기 때문입니다), getKeyType() 메소드는 모델의 기본 키가 문자열 유형임을 Laravel에 알려줍니다. bootUsesUuid() 메소드를 사용하면 Laravel의 강력한 수명주기 후크를 사용할 수 있습니다. 여기를 방문하시면 구양축제에 대한 자세한 내용을 보실 수 있습니다. 기본적으로 우리 코드는 이미 Laravel에게 이 모델의 새 인스턴스가 생성될 때 이에 대한 UUID 기본 키를 설정하라고 지시합니다!
이제 use 키워드를 사용하여 모델에 이 기능을 쉽게 구현할 수 있습니다.
<?php namespace App; use Illuminate\Database\Eloquent\Model; ... class Employee extends Model { ... use \App\Http\Traits\UsesUuid; ... }
UUID를 외래 키로 참조
테이블의 UUID를 외래 키로 참조하려면 테이블의 외래 키 필드 유형을 변경하기만 하면 됩니다. 다음과 같습니다...
Schema::create('another_table', function(Blueprint $table) { $table->id(); $table->unsignedBigInteger('employee_id'); $table->string('some_field'); $table->foreign('employee_id') ->references('id') ->on('shifts') ->onDelete('cascade'); });
... Employee_id 외래 키를 참조할 때 부호 없는 큰 정수 데이터 유형을 생성하고 다음과 같이 수정했습니다.
Schema::create('another_table', function(Blueprint $table) { $table->id(); $table->uuid('employee_id'); $table->string('some_field'); $table->foreign('employee_id') ->references('id') ->on('shifts') ->onDelete('cascade'); });
그렇게 간단합니다! 한 가지 더...
UUID와 다형성 관계
자신의 작업이나 가져오는 패키지를 통해 다형성 관계에서 이 모델을 참조할 수도 있습니다. 마이그레이션에서 테이블은 다음과 같습니다.
public function up() { Schema::create('some_package_table', function (Blueprint $table) { $table->bigIncrements('id'); $table->morphs('model'); ... } }
여기에서 morphs() 메소드는 데이터베이스에 unsigned big int 유형의 model_id와 문자열 유형의 model_type이라는 두 개의 필드를 생성합니다. 문제는 우리 모델이 이제 증가하는 정수 ID 대신 UUID를 사용하고 있기 때문에 오류가 발생하고 다음과 같은 내용이 표시된다는 것입니다. :
Data truncated for column 'model_id' at row 1
이제 새 UUID를 지원하려면 model_id 필드가 필요합니다. 유형은 다음과 같습니다. CHAR (36). 괜찮아요! Laravel을 사용하면 이 작업을 매우 쉽게 수행할 수 있으며 수동으로 수행할 필요가 없습니다. 마이그레이션을 다음으로 변경하세요:
public function up() { Schema::create('some_package_table', function (Blueprint $table) { $table->bigIncrements('id'); $table->uuidMorphs('model'); ... } }
Laravel을 사랑하는 또 다른 이유! 즐거운 코딩하세요!
추천 튜토리얼: "Laravel Tutorial"
위 내용은 Laravel 7에서 UUID를 우아하게 사용하는 방법에 대한 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!