Blog de programación, errores, soluciones

Chose Language:
Author: Admin/Publisher |finished | checked

laravel / controller – controladores en laravel

En este post veremos como crear un controlador en Laravel y como usarlo.

intro

Laravel usa algo parecido al patrón MVC, (modelo, vista, controlador). En este modelo el controlador se encarga de aceptar los datos pasados por input en nuestra vista y convertirlos en comandos para nuestro model, incluso se encarga de comunicarse con el modelo y enviar datos a la vista.

En Laravel sería algo así, la ruta llama al controlador y este intercambia datos con el modelo o llama una vista o hace las 2 cosas, o, por el contrario, evitamos el controlador y hacemos esto desde la ruta sin usar un controlador, algo no muy recomendable (en caso de querer llamar utilizar la ruta llamé una vista como mucho por ejemplo una landing page).

Empezaré creando un proyecto para los ejemplos:

Me crearé un proyecto nuevo y lo nombraré proyecto_de_ejemplo.

Project folder
 laravel new proyecto_de_ejemplo

¿Como crear un controlador?

Para crear un controlador en Laravel podemos escribirlo a mano o crearlo con el comando php artisan make:controller Nombre_del_controlador en consola dentro de la carpeta de nuestro proyecto.

Project folder
php artisan make:controller ClienteController
Controller created successfully

Hay varias variantes de este comando. Pero primero veamos el resultado de haber corrido el comando php artisan make:controller ClienteController

¿Dónde está mi controlador?

Para ver el controlador tenemos que ir a la carpeta de nuestro proyecto y luego a App>Http>Controllers>ClienteController.php para abrir la carpeta lo puede hacer con cualquier editor de código (por ejemplo Visual Studio Code, Atom, etc.) el siguiente código es lo creado por el comando anterior.

app/Http/Controllers/ClineteController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ClienteController extends Controller
{
    //
}

Controlador invocable

Continuemos con php artisan make:controller ShowHome --invokable como puede ver en este siguiente ejemplo, no es necesario que un controlador tenga la palabra controller aunque se usa para diferenciar que es un controlador

Project Folder
php artisan make:controller ShowHome --invocable

Haremos igual que en el controlador anterior e iremos a ShowHome

app/Http/Controllers/ShowHome.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ShowHome extends Controller
{
    /**
     * Handle the incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function __invoke(Request $request)
    {
        //
    }
}

Un controlador invokable es un controlador que solo realizara una acción y solo esa acción. Todo lo que este dentro de la función __invoke es lo que hará

CRUD en Laravel

Ahora veamos otra comando que le podemos agregar y es realmente útil. Para mostrar este lo que hace este comando borraré el controlador ClienteController.php Luego correremos el comando:

Project Folder
php artisan make:controller ClienteController --resource
app/Http/Controllers/ClienteController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ClienteController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

Como puede ver, al usar este comando hemos creado un controller para un sistema CRUD(significa crear, leer, modificar, borrar) o un sistema ABM(altas, bajas, modificar).

Pero todavía esto no es lo único que podemos hacer con resource, por otra parte, podemos hacer las rutas(ver rutas en laravel) pertinentes para este controller de una manera muy simple. En routes>web.php agregaremos la siguiente línea.

Tenga en cuenta la versión de su Laravel:

versiones anteriores a Laravel 8 routes/web.php
Route::resource('cliente', 'ClienteController');

En Laravel 8 cambia un poco el modo de declarar la ruta:

desde Laravel 8 route/web.php
use App\Http\Controllers\ClienteController;
Route::resource('cliente', ClienteController::class);

Una cosa más a agregar, vea que estamos usando use eso es porque estamos utilizando el autoload de composer.

Por esto es probable que si es una ruta completamente nueva tengamos que utilizar:

(project-folder)
composer dump-autoload

Le damos guardar e inspeccionamos las rutas que tenemos con php artisan route:list y vea la siguiente imagen.

todas las rutas en mi proyecto

Esto es útil, realmente útil, vea que escribir la línea anterior es el equivalente a escribir 7 líneas de rutas y esto aún puede verse más ventajoso cuando tenemos varios controllers usando resource.

Si tenemos varios controladores en que hemos usado, --resource podemos hacer lo siguiente.

antes de Laravel 8 routes/web.php
Route::resources([
    'cliente' => 'ClienteController',
    'usuario' => 'UsuarioController'
]);

Recuerde que la forma de declarar las rutas son diferentes a partir de Laravel 8

Laravel 8 o superiores routes/web.php
Route::resources([
    'cliente' => ClienteController::class,
    'usuario' => UsuarioController::class
]);

¿Excelente no? Pues no aún podemos hacer más con los controladores y con --resource. Borraré una vez más el controlador y usaré el siguiente comando en la consola:

php artisan make:controller ClienteController --resource --model=Cliente

Al correr este comando no solo creara el controlador, también nos preguntara si deseamos crear el modelo(ver modelos en laravel) pero además veamos el código generado

app/Http/Controllers/ClienteController.php
<?php

namespace App\Http\Controllers;

use App\Cliente;
use Illuminate\Http\Request;

class ClienteController extends Controller
{*
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Cliente  $cliente
     * @return \Illuminate\Http\Response
     */
    public function show(Cliente $cliente)
    {
        //
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     
    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Cliente  $cliente
     * @return \Illuminate\Http\Response
     */
    public function edit(Cliente $cliente)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Cliente  $cliente
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Cliente $cliente)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Cliente  $cliente
     * @return \Illuminate\Http\Response
     */
    public function destroy(Cliente $cliente)
    {
        //
    }
}

como puede ver ha agregado, Cliente $cliente esto quiere decir que estamos haciendo una inyección de el modelo como parámetro directamente podemos hacer cualquier operación con $cliente desde aquí.

Category: laravel
Something wrong? If you found an error or mistake in the content you can contact me on Twitter | @luisg2249_luis.
Last 4 post in same category