Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Versión 2: colección

13/18
Recursos

Aportes 7

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

En la ultima version de laravel que es la 8 no requiere agregar el
public $collects = PostResource::class;

A mí me lo ha hecho directamente sin añadir public $collects = PostResource::class; Entiendo que con la versión actual lo pilla directamente.

Les comparto el código fuente del archivo,
App\Http\Resources\V2\PostCollection.php

<?php

namespace App\Http\Resources\V2;

use Illuminate\Http\Resources\Json\ResourceCollection;

class PostCollection extends ResourceCollection
{
  public $collects = PostResource::class;
  
  /**
   * Transform the resource collection into an array.
   *
   * @param  \Illuminate\Http\Request  $request
   * @return array
   */
  public function toArray($request)
  {
    return [
      'data' => $this->collection,
      'meta' => [
        'organization' => 'Platzi',
        'authors' => [
          'Italomoralesf',
          'Platzi'
        ]
      ],
      'type' => 'articles'
    ];
  }
}

Resumen Creacion de API V2

Basicamente repetimos la configuracion inicial para crear una API

creamos el controlador y los “recursos” para personalizar la salida.

php artisan make:controller Api/V2/PostController --api --model=Post

php artisan make:resource V2/PostResource

php artisan make:resource V2/PostCollection

Primero que todo habilitamos la ruta de la api V2

use App\Http\Controllers\Api\V1\PostController as PostV1;
use App\Http\Controllers\Api\V2\PostController as PostV2;

Route::apiResource('v1/posts', PostV1::class)
->only(['index', 'show', 'destroy']);

Route::apiResource('v2/posts', PostV2::class)
    ->only(['index', 'show']);

… > api > V2 > postcontroller

Relacionamos el index y show con su respectivo recurso

use App\Http\Resources\V2\PostResource;
use App\Http\Resources\V2\PostCollection;

    public function index()
    {
        return new PostCollection(Post::latest()->paginate());
    }
public function show(Post $post)
    {
        return new PostResource($post); 
    }

creamos le aplicamos la configuracion al recurso

… > Resource > V2 > PostResource

public function toArray($request)
    {
        return [
            'id' => $this->id,
            'post_name' => $this->title,
            'slug' => $this->slug,
            'content' => $this->content,
            'author' => [
                'name' => $this->user->name,
                'email' => $this->user->email,
            ],
            'created_at' => $this->published_at
        ];
    }

Como estamos enviando la información del autor tenemos que agregar esta al modelo del post en App > Models > Post public function user() {
return $this->belongsTo(User::class);
}

… > Resource > V2 > PostCollection

public function toArray($request)
    {
        return [
            'data' => $this->collection,
            'meta' => [
                'organization' => 'Platzi',
                'authors' => [
                    'Camilo Mezu',
                    'Mezum sas'
                ]
            ],
            'type' => 'articles'
        ];
    }

Tambien se podría realizar este metodo para la colección
UserResource::collection(User::all());
Les recomiendo darse una leida por la doc:
https://laravel.com/docs/8.x/eloquent-resources#resource-collections

Estoy en la versión 9.x de Laravel y no es necesario el

public  $collects = PostResource::class;

para que los datos se muestren y ordenen en base al recurso.
Algo interesante. Simplemente luego de tener el archivo de Recursos este funciona en forma automática

bueno este tema de resources y colletions