# 4.- Creando nuestro primer Controller and Resource (Article)

Utilizaremos 2 opciones

  php artisan make:controller ArticleController -m Article --api

Vamos a àpp/Http/Controllers

  • Ahora crearemos un nuevo controlador para Author del articulo
  php artisan make:controller AuthorController

# Creando nuestro archivo Resource

Igualmente utilizamos 2 opciones para ver las diferencias

  php artisan make:resource ArticleResource
  php artisan make:resource AuthorResource
  php artisan make:resource ArticleCollection -c OR php artisan make:resource ArticleCollection --collection
  • Antes de avanzar vamos al archivo app/routes/api.php y creamos la ruta
    use App\Http\Controllers\ArticleController;
    Route::get('/articles', [ArticleController::class, 'index']);
  • Vamos al archivo app/Http/Resource/ArticleCollection.php Con esto podemos elegir que datos queremos enviar por nuestra API
    <?php

    namespace App\Http\Resources;

    use Illuminate\Http\Resources\Json\ResourceCollection;

    class ArticleCollection extends ResourceCollection
    {
        
        /**
         * Transform the resource collection into an array.
         *
         * @param  \Illuminate\Http\Request  $request
         * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
         */
        public function toArray($request)
        {
            return[
                'data' => $this->collection,
            ];
        }

        public function with($request)
        {
            return [
                'status' => 'success'
            ];
        }

        public function withResponse($request, $response)
        {
            $response->header('Accept', 'application/json');
        }
    }

  • Vamos al archivo app/Http/Resource/ArticleResource.php Esta opción tiene la función de poder elegir solo algunos datos que queremos enviar y tiene que ir acompañado con el archivo ArticleCollection
    <?php

    namespace App\Http\Resources;

    use Illuminate\Http\Resources\Json\JsonResource;

    class ArticleResource extends JsonResource
    {
        /**
         * Transform the resource into an array.
         *
         * @param  \Illuminate\Http\Request  $request
         * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
         */

        //code
        public function toArray($request)
        {
            return [
                'id' => $this->resource->id,
                'title' => $this->resource->title,
            ];
        }

    }
  • Utilizamos la configuración que realizamos en app/Http/Resource/ArticleCollection.php y app/Http/Resource/ArticleResource.php e importamos al controlador app/Http/Controller/ArticleController.php
    //import archivo collection para todos los datos de un articulo
    use App\Http\Resources\ArticleCollection;
    use App\Models\Article;
    public function index(Request $request)
    {
        $articles = Article::all();
        return response()->json([
                'success' => true, 
                'articles' => new ArticleCollection($articles)
        ]);
    }
    //import archivo resource para mostrar algunos datos elegidos
    {
        $article = Article::find($id);
        if (!$article) {
            return response()->json([
                'success' => false, 
                'message' => 'article does not exist'
            ]);
        }
        return response()->json([
            'success' => true, 
            'article' => new ArticleResource($article)
        ]);
    }

WARNING

Hasta acá ya tenemos una Api con Laravel Sanctum

Recursos resource - collection Laravel (opens new window)
Recursos Pagination Laravel (opens new window)

# Configurando la función para el login

  • Tenemos que enviar el user y token y para eso realizaremos lo siguiente.

Buscamos el archivo app/Http/Controllers/Auth/AuthenticatedSessionController.php y en la function store()

    //Antes
    public function store(LoginRequest $request)
    {
        $request->authenticate();

        $request->session()->regenerate();

        return response()->noContent();
    }
    //Ahora
    public function store(LoginRequest $request)
    {
        $request->authenticate();

        $request->session()->regenerate();

        $user = auth()->user();

        return response()->json([
            'success' => true,
            'data' => [
                'token' => $user->createToken($user->name)->plainTextToken,
                'name' => $user->name,
            ],
            'message' => 'User logged in!'
        ]);
    }

Ahora ya podemos capturar el user y el token al realizar login, ahora seguimos con el logout donde tenemos que eliminar el token creado cuando cerremos sesión

  • Cerrando sesión
    //Antes
    public function destroy(Request $request)
    {
        Auth::guard('web')->logout();

        $request->session()->invalidate();

        $request->session()->regenerateToken();

        return response()->noContent();
    }
    //Ahora
    public function destroy(Request $request)
    {
        auth()->user()->tokens()->delete();
        Auth::guard('web')->logout();

        $request->session()->invalidate();

        $request->session()->regenerateToken();

        return response()->noContent();
    }

# Otros: Agregando paginación

     public function index(Request $request)
    {
        
        $pageSize = $request->page_size ?? 3;
        $articles = Article::paginate($pageSize);
        return response()->json([
            'success' => true, 
            'articles' => new ArticleCollection($articles),
            'articles' => $articles, //Se agrega nuevamente para que aparezca la paginación, si no esta esto no enviara los demas datos y con el mismo nombre

            //Puede hacer una prueba borrando o comentando la linea
        ]);
    }