Laravel 5 가 json api 를 디자인 할 때

3434 단어 laravel
질문
api 를 개발 할 때 이 문 제 는 클 라 이언 트 와 가장 많이 교섭 하 는 문제 입 니 다. 예 를 들 어 하나의 user 구조, 돌아 오 는 필드 는 원래 user 입 니 다.name 의, string 형식 일 것 입 니 다.그러나 데이터베이스 가 이 필드 를 디자인 할 때 null 로 허용 되 기 때문에 이 필드 를 가 져 오 면 null 로 돌아 갈 수 있 습 니 다. 이것 은 약 한 유형 언어 에 문제 가 없 지만 강 한 유형의 언어 에 대해 서 는 문자 의 유형 판단 을 추가 해 야 할 수도 있 습 니 다.
또는 데이터베이스 에 있 는 text 필드 에 json 데이터 가 저장 되 어 있 습 니 다. 지금 꺼 낼 때 변환 을 해 야 합 니 다.
그래서 이 문제 에 대해 우 리 는 하나의 격식 방법 을 생각 할 것 이다.이 방법 은 자 연 스 럽 게 model 에 쓰 여 있 습 니 다. laravel 5 에서 저 는 이런 방법 을 사용 합 니 다.
모델 중:
class Inbox extends Model {

    protected $table = 'inbox';

    public static function format()
    {
        return function($item) {
            $tmp = $item->toArray();
            unset($tmp['deleted_at']);
            $tmp['sort'] = $tmp['id'];
            $tmp['uid'] = $tmp['sender'];
            $content = json_decode($item->content, true);
            $tmp['content'] = json_decode($content['content'], true);

            return $tmp;
        };
    }

    public static function formatRaw()
    {
        return function($item) {
            $tmp = $item->toArray();
            unset($tmp['deleted_at']);
            $tmp['sort'] = $tmp['id'];
            $tmp['uid'] = $tmp['sender'];

            return $tmp;
        };
    }
}

이곳 의 Inbox 는 두 가지 반환 형식 을 설계 하 였 으 며, 모든 반환 형식 은 되 돌아 오 는 패 킷 함수 이 며, 그 다음 에 controller 에 있 습 니 다.
$builder = Inbox::where('receiver', $uid)->where('sender', 0);

if ($max) {
    $builder->where('id', '<', $max);
}
$inboxs = $builder->orderBy('id', 'desc')->get();
$data = $inboxs->transform(Inbox::formatRaw());

자, 이렇게 되 돌아 오 는 $data 는 구조 화 된 데이터 입 니 다.
여기 서 주로 laravel 의 Collection 에 있 는 transfrom 함수 가 너무 좋다 고 말 하고 싶 습 니 다. 매개 변 수 는 닫 힌 패키지 입 니 다. 그리고 이 닫 힌 패 키 지 는 model 에 밀봉 되 어 있 습 니 다. 클 라 이언 트 가 특정한 출력 필드 를 수정 하거나 업데이트 하려 면 format 함수 만 수정 하면 됩 니 다.
질문
예 를 들 어 위의 예 에서 inbox 는 uid 가 있 고 인 터 페 이 스 는 user 의 정 보 를 되 돌려 야 합 니 다.그러면 이때 model 의 foreign key 가 좋 은 역할 을 합 니 다.
class Inbox extends Model {

    protected $table = 'inbox';

    public function user()
    {
        return $this->hasOne('User', 'id', 'uid');
    }

    public static function format()
    {
        return function($item) {
            $user = $item->user;
            $tmp = $item->toArray();
            unset($tmp['deleted_at']);
            $tmp['sort'] = $tmp['id'];
            $tmp['uid'] = $tmp['sender'];
            $content = json_decode($item->content, true);
            $tmp['content'] = json_decode($content['content'], true);
            $tmp['user'] = $user;
            return $tmp;
        };
    }
}

그러나 모든 데이터 순환 으로 user 를 가 져 오지 않도록 load 나 with 를 표시 해 야 합 니 다.
$builder = Inbox::where('receiver', $uid)->where('sender', 0);

if ($max) {
    $builder->where('id', '<', $max);
}
$inboxs = $builder->orderBy('id', 'desc')->get();
$inboxs->load('user');
$data = $inboxs->transform(Inbox::formatRaw());

총결산
기본적으로 이 두 가지 문 제 를 해결 하고 orm 을 설계 하 며 laravel 로 인 터 페 이 스 를 쓰 면 매우 빠르다.

좋은 웹페이지 즐겨찾기