>  기사  >  PHP 프레임워크  >  Laravel이 자동으로 긴 정수 눈송이 ID를 문자열로 변환하는 방법을 가르쳐주세요.

Laravel이 자동으로 긴 정수 눈송이 ID를 문자열로 변환하는 방법을 가르쳐주세요.

藏色散人
藏色散人앞으로
2020-11-03 15:06:072690검색

튜토리얼 칼럼에서는 Laravel이 길고 통합된 눈송이를 문자열로 자동 변환하는 방법을 소개합니다. 필요한 친구들에게 도움이 되길 바랍니다! API를 설계할 때 보안 등의 이유로 ID를 비연속적이고 추측할 수 없게 만들기 위해 자동 증가 ID 사용을 포기해야 하는 경우가 있습니다. 이는 일반적으로 해시 ID, UUID, Snowflake ID 등을 사용하여 달성할 수 있습니다. 최근 프로젝트에서 Snowflake ID를 사용해 보았습니다. 많은 고민 끝에 성능이 매우 높고 구현이 매우 간단하다는 것을 알았습니다. 그런데 계속해서 팔을 걷어붙이고 프런트엔드 부분과 연결을 해보니 저장된 ID가 unsigned bigint 값이어서 JS 정밀도 손실 문제가 발생했습니다. (정확도가 떨어지는 이유에 대해서는 여기서 자세히 설명하지 않습니다. 확실하지 않은 경우 직접 검색해 볼 수 있습니다.) 이 글에서는 주로 해결 방법을 소개합니다.

이 문제를 해결하기 위한 기본 원리는 매우 간단합니다. 즉, ID를 문자열로 변환한 다음 프런트 엔드에 반환하는 것입니다.

나쁜 시도

처음에는 Laravel Eloquent 모델의 모델 접근자를 사용하려고 생각했습니다. 변환이 필요한 모델에 getIdAttribute를 추가하고 ID를 문자열로 변환하면 되겠죠? 예: AppModelsUser 모델은 다음과 같이 씁니다.

/**

 * @return string

 */public function getIdAttribute(){

    return strval($this->attributes['id']);}

그러나 이는 사실이 아닙니다. 속성 접근자는 실제로 API가 프런트 엔드에 반환한 ID를 문자열로 만들 수 있습니다. 그러나 이는 연관된 모델을 삽입하고 수정한 결과에도 영향을 미칩니다. 예를 들어 사용자가 게시물 모델에 연결된 경우 $user->posts()->saveMany(…)를 사용하여 새 게시물 레코드를 저장합니다. 이렇게 하면 해당 user_id가 비어 있게 됩니다.

이것은 모델 접근자가 모델 관련 처리에 참여해야 하기 때문에 이해하기 어렵지 않습니다. 접근자는 ID를 숫자에서 문자열로 변환하므로 자연스럽게 데이터 혼란이 발생합니다.

올바른 자세

진정하고 신중하게 생각한 후 조치를 취하세요. 공식 문서를 확인한 결과 Resource가 바로 제가 원하는 것임을 알았습니다. 리소스는 프런트 엔드에 반환된 데이터에만 영향을 미칩니다. 리소스를 사용자 정의하여 API 반환 결과의 구조, 유형 변환 및 기타 기능을 구현할 수 있습니다. ID변경은 쉽습니다. 문제를 해결하기 위해 AppHttpResource 기본 클래스를 직접 수정합니다. toArray() 메서드를 오버로드하고 재귀를 사용하여 JS의 안전 범위를 초과할 수 있는 값을 변환하면 됩니다. 실제 상황에 따라 UserResource와 같은 새로운 Resource 클래스를 생성할 수도 있습니다.

<?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);
    }
}

결과는 아래와 같습니다.


Laravel 自动转换长整型雪花 ID 为字符串Notes

이 방법은 순회 및 재귀 처리를 사용하기 때문에 데이터 구조가 복잡하고 데이터 양이 많을 경우 성능에 일정한 영향을 줄 수 있습니다. 크기가 큰. 이것은 게으르고 까다로운 작성 방법이라고 생각합니다. 리소스 클래스를 사용자 정의한 다음 알려진 특정 필드 이름을 기반으로 변환하는 것이 좋습니다

  • 왜냐하면 프런트 엔드에 반환되는 ID는 문자열로 변환된 프론트엔드는 비교 판단, 특히 === 판단

  • 을 할 때 특별한 주의를 기울여야 합니다.

위 내용은 Laravel이 자동으로 긴 정수 눈송이 ID를 문자열로 변환하는 방법을 가르쳐주세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제