Bộ sưu tập tài nguyên Laravel với mối quan hệ

Khi xây dựng API, bạn có thể cần một lớp chuyển đổi nằm giữa các mô hình Eloquent của bạn và các phản hồi JSON thực sự được trả về cho người dùng ứng dụng của bạn. Các lớp tài nguyên của Laravel cho phép bạn chuyển đổi các mô hình và bộ sưu tập mô hình của bạn thành JSON một cách rõ ràng và dễ dàng

Tạo tài nguyên

Để tạo một lớp tài nguyên, bạn có thể sử dụng lệnh Artisan

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
5. Theo mặc định, tài nguyên sẽ được đặt trong thư mục
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
6 của ứng dụng của bạn. Tài nguyên mở rộng lớp
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
7

php artisan make:resource User

Bộ sưu tập tài nguyên

Ngoài việc tạo các tài nguyên chuyển đổi các mô hình riêng lẻ, bạn có thể tạo các tài nguyên chịu trách nhiệm chuyển đổi các bộ sưu tập mô hình. Điều này cho phép phản hồi của bạn bao gồm các liên kết và thông tin meta khác có liên quan đến toàn bộ bộ sưu tập của một tài nguyên nhất định

Để tạo một bộ sưu tập tài nguyên, bạn nên sử dụng cờ

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
8 khi tạo tài nguyên. Hoặc, bao gồm từ
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
9 trong tên tài nguyên sẽ cho Laravel biết rằng nó sẽ tạo một tài nguyên bộ sưu tập. Tài nguyên bộ sưu tập mở rộng lớp
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});
0

php artisan make:resource Users --collection

php artisan make:resource UserCollection

Khái niệm tổng quan

Đây là tổng quan cấp cao về tài nguyên và bộ sưu tập tài nguyên. Bạn nên đọc các phần khác của tài liệu này để hiểu sâu hơn về tùy chỉnh và sức mạnh mà tài nguyên cung cấp cho bạn

Trước khi đi sâu vào tất cả các tùy chọn có sẵn cho bạn khi viết tài nguyên, trước tiên chúng ta hãy xem xét kỹ cách sử dụng tài nguyên trong Laravel. Một lớp tài nguyên đại diện cho một mô hình duy nhất cần được chuyển đổi thành cấu trúc JSON. Ví dụ, đây là một lớp tài nguyên

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});
1 đơn giản



namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class User extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}

Mỗi lớp tài nguyên định nghĩa một phương thức

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});
2 trả về mảng các thuộc tính sẽ được chuyển đổi thành JSON khi gửi phản hồi. Lưu ý rằng chúng ta có thể truy cập các thuộc tính mô hình trực tiếp từ biến
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});
3. Điều này là do một lớp tài nguyên sẽ tự động ủy quyền quyền truy cập thuộc tính và phương thức xuống mô hình bên dưới để truy cập thuận tiện. Khi tài nguyên được xác định, nó có thể được trả về từ một tuyến đường hoặc bộ điều khiển

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});

Bộ sưu tập tài nguyên

Nếu bạn đang trả về một tập hợp tài nguyên hoặc phản hồi được phân trang, bạn có thể sử dụng phương thức

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});
4 khi tạo phiên bản tài nguyên trong tuyến hoặc bộ điều khiển của mình

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});

Lưu ý rằng điều này không cho phép bổ sung bất kỳ dữ liệu meta nào có thể cần được trả lại cùng với bộ sưu tập. Nếu bạn muốn tùy chỉnh phản hồi của bộ sưu tập tài nguyên, bạn có thể tạo một tài nguyên chuyên dụng để đại diện cho bộ sưu tập

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
5

Khi lớp tập hợp tài nguyên đã được tạo, bạn có thể dễ dàng xác định bất kỳ dữ liệu meta nào sẽ được đưa vào phản hồi

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
6

Sau khi xác định bộ sưu tập tài nguyên của bạn, nó có thể được trả về từ một tuyến đường hoặc bộ điều khiển

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
7

Bảo quản khóa bộ sưu tập

Khi trả về một bộ sưu tập tài nguyên từ một tuyến đường, Laravel đặt lại các khóa của bộ sưu tập để chúng theo thứ tự số đơn giản. Tuy nhiên, bạn có thể thêm thuộc tính

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});
5 vào lớp tài nguyên của mình để cho biết liệu có nên giữ lại khóa bộ sưu tập hay không

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
9

Khi thuộc tính

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});
5 được đặt thành
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});
7, khóa bộ sưu tập sẽ được giữ nguyên

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
2

Tùy chỉnh lớp tài nguyên cơ bản

Thông thường, thuộc tính

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});
8 của bộ sưu tập tài nguyên được điền tự động với kết quả của việc ánh xạ từng mục của bộ sưu tập tới lớp tài nguyên duy nhất của nó. Lớp tài nguyên số ít được coi là tên lớp của bộ sưu tập không có chuỗi
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
9 ở cuối

Ví dụ:

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
50 sẽ cố gắng ánh xạ các phiên bản người dùng đã cho vào tài nguyên
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});
1. Để tùy chỉnh hành vi này, bạn có thể ghi đè lên thuộc tính
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
52 của bộ sưu tập tài nguyên của mình

php artisan make:resource Users --collection

php artisan make:resource UserCollection
0

Tài nguyên viết

Nếu bạn chưa đọc phần tổng quan về khái niệm, bạn nên làm như vậy trước khi tiếp tục với tài liệu này

Về bản chất, tài nguyên rất đơn giản. Họ chỉ cần chuyển đổi một mô hình nhất định thành một mảng. Vì vậy, mỗi tài nguyên chứa một phương thức

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});
2 dịch các thuộc tính của mô hình của bạn thành một mảng thân thiện với API có thể được trả lại cho người dùng của bạn



namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class User extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}

Khi một tài nguyên đã được xác định, nó có thể được trả về trực tiếp từ một tuyến đường hoặc bộ điều khiển

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});

Các mối quan hệ

Nếu bạn muốn bao gồm các tài nguyên liên quan trong phản hồi của mình, bạn có thể thêm chúng vào mảng được trả về bởi phương thức

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});
2 của bạn. Trong ví dụ này, chúng tôi sẽ sử dụng phương pháp
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});
4 của tài nguyên
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
55 để thêm các bài đăng trên blog của người dùng vào phản hồi của tài nguyên

php artisan make:resource Users --collection

php artisan make:resource UserCollection
3

Nếu bạn chỉ muốn bao gồm các mối quan hệ khi chúng đã được tải, hãy xem tài liệu về các mối quan hệ có điều kiện

Bộ sưu tập tài nguyên

Trong khi các tài nguyên dịch một mô hình đơn lẻ thành một mảng, thì các bộ sưu tập tài nguyên dịch một tập hợp các mô hình thành một mảng. Không nhất thiết phải xác định lớp bộ sưu tập tài nguyên cho từng loại mô hình của bạn vì tất cả các tài nguyên đều cung cấp phương thức

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});
4 để tạo bộ sưu tập tài nguyên "đặc biệt" một cách nhanh chóng

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});

Tuy nhiên, nếu bạn cần tùy chỉnh siêu dữ liệu được trả về cùng với bộ sưu tập, thì cần phải xác định một bộ sưu tập tài nguyên

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
6

Giống như các tài nguyên đơn lẻ, các bộ sưu tập tài nguyên có thể được trả về trực tiếp từ các tuyến hoặc bộ điều khiển

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
7

gói dữ liệu

Theo mặc định, tài nguyên ngoài cùng của bạn được bọc trong khóa

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
58 khi phản hồi tài nguyên được chuyển thành JSON. Vì vậy, ví dụ, một phản hồi thu thập tài nguyên điển hình trông giống như sau

php artisan make:resource Users --collection

php artisan make:resource UserCollection
7

Nếu bạn muốn tắt tính năng bao bọc của tài nguyên ngoài cùng, bạn có thể sử dụng phương thức

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
59 trên lớp tài nguyên cơ sở. Thông thường, bạn nên gọi phương thức này từ
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
60 hoặc nhà cung cấp dịch vụ khác được tải theo mọi yêu cầu đối với ứng dụng của bạn

php artisan make:resource Users --collection

php artisan make:resource UserCollection
8

Phương pháp

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
59 chỉ ảnh hưởng đến phản hồi ngoài cùng và sẽ không xóa các khóa
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
58 mà bạn thêm vào bộ sưu tập tài nguyên của mình theo cách thủ công

Gói tài nguyên lồng nhau

Bạn có toàn quyền quyết định cách các mối quan hệ của tài nguyên được bao bọc. Nếu bạn muốn tất cả các bộ sưu tập tài nguyên được bao bọc trong một khóa

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
58, bất kể chúng được lồng vào nhau như thế nào, bạn nên xác định một lớp bộ sưu tập tài nguyên cho mỗi tài nguyên và trả về bộ sưu tập trong một khóa
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
58

Bạn có thể tự hỏi liệu điều này có khiến tài nguyên ngoài cùng của bạn bị gói trong hai khóa

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
58 không. Đừng lo lắng, Laravel sẽ không bao giờ để tài nguyên của bạn vô tình bị double-wrapped, vì vậy bạn không cần phải lo lắng về mức độ lồng nhau của bộ sưu tập tài nguyên mà bạn đang chuyển đổi

php artisan make:resource Users --collection

php artisan make:resource UserCollection
9

Gói dữ liệu và phân trang

Khi trả về các bộ sưu tập được đánh số trang trong một phản hồi tài nguyên, Laravel sẽ bọc dữ liệu tài nguyên của bạn trong khóa

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
58 ngay cả khi phương thức
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
59 đã được gọi. Điều này là do các phản hồi được phân trang luôn chứa các khóa
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
68 và
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
69 với thông tin về trạng thái của trình phân trang



namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class User extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}
0

phân trang

Bạn luôn có thể chuyển một thể hiện của trình phân trang tới phương thức

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});
4 của tài nguyên hoặc tới một bộ sưu tập tài nguyên tùy chỉnh



namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class User extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}
1

Phản hồi được phân trang luôn chứa các khóa

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
68 và
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
69 với thông tin về trạng thái của người phân trang



namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class User extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}
0

Thuộc tính có điều kiện

Đôi khi, bạn có thể chỉ muốn đưa một thuộc tính vào phản hồi tài nguyên nếu một điều kiện nhất định được đáp ứng. Ví dụ: bạn có thể chỉ muốn bao gồm một giá trị nếu người dùng hiện tại là "quản trị viên". Laravel cung cấp nhiều phương thức trợ giúp để hỗ trợ bạn trong tình huống này. Phương thức

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
73 có thể được sử dụng để thêm một thuộc tính vào phản hồi tài nguyên một cách có điều kiện



namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class User extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}
3

Trong ví dụ này, khóa

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
74 sẽ chỉ được trả về trong phản hồi tài nguyên cuối cùng nếu phương thức
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
75 của người dùng được xác thực trả về
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});
7. Nếu phương thức trả về
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
77, khóa
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
74 sẽ bị xóa hoàn toàn khỏi phản hồi tài nguyên trước khi được gửi lại cho máy khách. Phương thức
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
73 cho phép bạn xác định rõ ràng các tài nguyên của mình mà không cần dùng đến các câu điều kiện khi xây dựng mảng

Phương thức

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
73 cũng chấp nhận Đóng làm đối số thứ hai, cho phép bạn tính giá trị kết quả chỉ khi điều kiện đã cho là
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});
7



namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class User extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}
4

Hợp nhất các thuộc tính có điều kiện

Đôi khi, bạn có thể có một số thuộc tính chỉ nên được đưa vào phản hồi tài nguyên dựa trên cùng một điều kiện. Trong trường hợp này, bạn có thể sử dụng phương pháp

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
92 để chỉ bao gồm các thuộc tính trong phản hồi khi điều kiện đã cho là
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});
7



namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class User extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}
5

Một lần nữa, nếu điều kiện đã cho là

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
77, các thuộc tính này sẽ bị xóa hoàn toàn khỏi phản hồi của tài nguyên trước khi nó được gửi tới máy khách

Không nên sử dụng phương thức

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
92 trong các mảng kết hợp các phím chuỗi và số. Hơn nữa, nó không nên được sử dụng trong các mảng có các phím số không được sắp xếp theo thứ tự

Mối quan hệ có điều kiện

Ngoài các thuộc tính tải có điều kiện, bạn có thể đưa các mối quan hệ vào các phản hồi tài nguyên của mình một cách có điều kiện dựa trên việc liệu mối quan hệ đã được tải trên mô hình hay chưa. Điều này cho phép bộ điều khiển của bạn quyết định mối quan hệ nào sẽ được tải trên mô hình và tài nguyên của bạn chỉ có thể dễ dàng bao gồm chúng khi chúng thực sự đã được tải

Cuối cùng, điều này giúp tránh các sự cố truy vấn "N+1" trong tài nguyên của bạn dễ dàng hơn. Phương pháp

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
96 có thể được sử dụng để tải một mối quan hệ có điều kiện. Để tránh tải các mối quan hệ không cần thiết, phương pháp này chấp nhận tên của mối quan hệ thay vì chính mối quan hệ đó



namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class User extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}
6

Trong ví dụ này, nếu mối quan hệ chưa được tải, khóa

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
97 sẽ bị xóa hoàn toàn khỏi phản hồi tài nguyên trước khi nó được gửi tới máy khách

Thông tin xoay vòng có điều kiện

Ngoài việc đưa thông tin về mối quan hệ vào phản hồi tài nguyên của bạn một cách có điều kiện, bạn có thể đưa vào một cách có điều kiện dữ liệu từ các bảng trung gian của mối quan hệ nhiều-nhiều bằng cách sử dụng phương pháp

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
98. Phương thức
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
98 chấp nhận tên của bảng tổng hợp làm đối số đầu tiên của nó. Đối số thứ hai phải là một Đóng xác định giá trị được trả về nếu thông tin trục có sẵn trên mô hình



namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class User extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}
7

Nếu bảng trung gian của bạn đang sử dụng một bộ truy cập không phải là

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
20, bạn có thể sử dụng phương pháp
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
21



namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class User extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}
8

Thêm siêu dữ liệu

Một số tiêu chuẩn API JSON yêu cầu bổ sung dữ liệu meta vào các phản hồi về bộ sưu tập tài nguyên và tài nguyên của bạn. Điều này thường bao gồm những thứ như

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
69 đối với tài nguyên hoặc các tài nguyên liên quan hoặc siêu dữ liệu về chính tài nguyên đó. Nếu bạn cần trả về dữ liệu meta bổ sung về một tài nguyên, hãy đưa nó vào phương thức
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});
2 của bạn. Ví dụ: bạn có thể bao gồm thông tin
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
24 khi chuyển đổi một bộ sưu tập tài nguyên



namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class User extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}
9

Khi trả về dữ liệu meta bổ sung từ tài nguyên của bạn, bạn không bao giờ phải lo lắng về việc vô tình ghi đè các khóa

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
69 hoặc
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
68 được Laravel tự động thêm vào khi trả về các phản hồi được phân trang. Bất kỳ
use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
69 bổ sung nào bạn xác định sẽ được hợp nhất với các liên kết do trình phân trang cung cấp

Siêu dữ liệu cấp cao nhất

Đôi khi, bạn có thể chỉ muốn bao gồm một số dữ liệu meta nhất định với phản hồi tài nguyên nếu tài nguyên là tài nguyên ngoài cùng được trả về. Thông thường, điều này bao gồm thông tin meta về toàn bộ phản hồi. Để xác định siêu dữ liệu này, hãy thêm phương thức

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
28 vào lớp tài nguyên của bạn. Phương thức này sẽ trả về một mảng dữ liệu meta được bao gồm trong phản hồi tài nguyên chỉ khi tài nguyên là tài nguyên ngoài cùng được hiển thị

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
0

Thêm siêu dữ liệu khi xây dựng tài nguyên

Bạn cũng có thể thêm dữ liệu cấp cao nhất khi xây dựng các phiên bản tài nguyên trong tuyến đường hoặc bộ điều khiển của mình. Phương thức

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
29, có sẵn trên tất cả các tài nguyên, chấp nhận một mảng dữ liệu sẽ được thêm vào phản hồi của tài nguyên

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
1

Phản hồi tài nguyên

Như bạn đã đọc, tài nguyên có thể được trả về trực tiếp từ các tuyến và bộ điều khiển

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});

Tuy nhiên, đôi khi bạn có thể cần tùy chỉnh phản hồi HTTP gửi đi trước khi nó được gửi tới máy khách. Có hai cách để thực hiện điều này. Trước tiên, bạn có thể xâu chuỗi phương thức

php artisan make:resource Users --collection

php artisan make:resource UserCollection
00 vào tài nguyên. Phương thức này sẽ trả về một phiên bản
php artisan make:resource Users --collection

php artisan make:resource UserCollection
01, cho phép bạn kiểm soát hoàn toàn các tiêu đề của phản hồi

use App\Http\Resources\User as UserResource;
use App\User;

Route::get('/user', function () {
    return new UserResource(User::find(1));
});
3

Ngoài ra, bạn có thể định nghĩa một phương thức

php artisan make:resource Users --collection

php artisan make:resource UserCollection
02 trong chính tài nguyên đó. Phương thức này sẽ được gọi khi tài nguyên được trả về dưới dạng tài nguyên ngoài cùng trong phản hồi