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 folderlaravel 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.
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
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 Folderphp artisan make:controller ClienteController --resourceapp/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.phpRoute::resource('cliente', 'ClienteController');
En Laravel 8 cambia un poco el modo de declarar la ruta:
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:
composer dump-autoload
Le damos guardar e inspeccionamos las rutas que tenemos con php artisan route:list
y vea la siguiente imagen.
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.
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.phpRoute::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í.