No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de API REST con Laravel

Curso de API REST con Laravel

Profesor Italo Morales F

Profesor Italo Morales F

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?

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'
    ];
  }
}

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

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

bueno este tema de resources y colletions