튜토리얼 칼럼에서는 Laravel이 길고 통합된 눈송이를 문자열로 자동 변환하는 방법을 소개합니다. 필요한 친구들에게 도움이 되길 바랍니다! API를 설계할 때 보안 등의 이유로 ID를 비연속적이고 추측할 수 없게 만들기 위해 자동 증가 ID 사용을 포기해야 하는 경우가 있습니다. 이는 일반적으로 해시 ID, UUID, Snowflake ID 등을 사용하여 달성할 수 있습니다. 최근 프로젝트에서 Snowflake ID를 사용해 보았습니다. 많은 고민 끝에 성능이 매우 높고 구현이 매우 간단하다는 것을 알았습니다. 그런데 계속해서 팔을 걷어붙이고 프런트엔드 부분과 연결을 해보니 저장된 ID가 unsigned bigint 값이어서 JS 정밀도 손실 문제가 발생했습니다. (정확도가 떨어지는 이유에 대해서는 여기서 자세히 설명하지 않습니다. 확실하지 않은 경우 직접 검색해 볼 수 있습니다.) 이 글에서는 주로 해결 방법을 소개합니다.
이 문제를 해결하기 위한 기본 원리는 매우 간단합니다. 즉, ID를 문자열로 변환한 다음 프런트 엔드에 반환하는 것입니다.
나쁜 시도
/** * @return string */public function getIdAttribute(){ return strval($this->attributes['id']);}
그러나 이는 사실이 아닙니다. 속성 접근자는 실제로 API가 프런트 엔드에 반환한 ID를 문자열로 만들 수 있습니다. 그러나 이는 연관된 모델을 삽입하고 수정한 결과에도 영향을 미칩니다. 예를 들어 사용자가 게시물 모델에 연결된 경우 $user->posts()->saveMany(…)를 사용하여 새 게시물 레코드를 저장합니다. 이렇게 하면 해당 user_id가 비어 있게 됩니다.
이것은 모델 접근자가 모델 관련 처리에 참여해야 하기 때문에 이해하기 어렵지 않습니다. 접근자는 ID를 숫자에서 문자열로 변환하므로 자연스럽게 데이터 혼란이 발생합니다.
올바른 자세
<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class Resource extends JsonResource { /** * Transform the resource into an array. * * @param \Illuminate\Http\Request $request * * @return array */ public function toArray($request) { $parentReturn = parent::toArray($request); foreach (array_keys($parentReturn) as $key) { // 为方便演示这里把所有整型字段都转成字符串 if (is_int($parentReturn[$key])) { $parentReturn[$key] = strval($parentReturn[$key]); } // 关联的字段,如 $user->post,相当于递归处理 if (is_array($parentReturn[$key])) { $parentReturn[$key] = new Resource($parentReturn[$key]); } } return $parentReturn; } }
그런 다음 인터페이스 컨트롤러에서 Resource를 반환하여 데이터를 반환하면 정수 필드 값이 자동으로 문자열이 됩니다.
<?php namespace App\Http\Controllers; use App\Http\Resources\Resource; use App\Models\User; use Illuminate\Http\Request; class TestController extends Controller { /** * @return \App\Http\Resources\Resource */ public function __invoke(Request $request) { $user = User::first(); return new Resource($user); } }
결과는 아래와 같습니다.
Notes
왜냐하면 프런트 엔드에 반환되는 ID는 문자열로 변환된 프론트엔드는 비교 판단, 특히 === 판단
위 내용은 Laravel이 자동으로 긴 정수 눈송이 ID를 문자열로 변환하는 방법을 가르쳐주세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!