Resource controllers en laravel
Hasta ahora, todo lo que hemos visto desde el primer día en este blog es lo que yo considero nivel básico en Laravel. En un post anterior vimos el tema de los controladores en laravel, el día de hoy veremos un tema un poco más profundo que yo consideraría de nivel intermedio, no por la complejidad del tema en sí, sino por que muchos desarrolladores se quedan con el conocimiento básico que ya hemos visto anteriormente. Si más preámbulo, los resource controlles.
Qué es un resource controller ?
Un resource controller es un controlador que tienen las típidas operaciones CRUD (create, read, update, delete). Estos controladores suelen aparecer cuando estás diseñando alguna interfaz de gestión o administración de alguna entidad de tu aplicación, por ejemplo la entidad Usuarios. Cuando creas un controlador que gestiona usuarios, bien sea UsuariosController, AdminUsuarios, o como lo quieras llamar usualmente tienes métodos que definen las acciones sobre esta entidad como lo son ver (show), actualizar (update), nuevo (create) y eliminar (delete). Un resource controller en laravel te ayuda precisamente con el scaffolding de estos controladores para crearlos y gestionarlos de manera más eficiente.
Crear un resource controller
Para crear un resource controller debes ejecutar el siguiente comando con artisan:
php artisan make:controller UsersController --resource
Este comando creará un scaffolding para el controlador similar al siguiente:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UsersController 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)
{
//
}
}
Enseguida, lo siguiente que debemos hacer para que quede totalmente funcional nuestro resource controller es definir las rutas en el archivo routes/web.php. Sin embargo, en vez de definir cada ruta para cada método podemos hacerlo de la siguiente forma:
Route::resource('users', 'UsersController');
La forma como se interprean las rutas desde el navegador la veremos a continuación.
Acciones de un resource controller
La tabla base para saber como se interpretan las rutas es la siguiente:
Verbo | URI | Acción | Ruta |
---|---|---|---|
GET | /users | index | users.index |
GET | /users/create | create | users.create |
POST | /users | store | users.store |
GET | /users/{photo} | show | users.show |
GET | /users/{photo}/edit | edit | users.edit |
PUT/PATCH | /users/{photo} | update | users.update |
DELETE | /users/{photo} | destroy | users.destroy |
Su intepretación es sencilla y predecible, por ejemplo si lo que deseas es mostrar la información de un usuario en particular (READ) debe utilizar el nombre de ruta users.show (GET) lo cual implica implementar la lógica necesaria en el método show. Si lo que deseas es crear un nuevo usuario, puedes utilizar la ruta users.create (GET) para mostrar el formulario de creación de usuario y la ruta users.store (POST) para procesar la creación del registro.
Si aún no te has dado cuenta, tal vez pueda surgir la pregunta acerca cómo se puede procesar un registro por PUT/PATCH/DELETE enviando la solicitud desde un formulario HTML. Laravel lo resuelve con ayuda de blade al crear un dato adicional en el formulario que indica el método a utilizar.
<form>
@method('PUT')
</form>
Además de esto, puedes definir parcialmente las rutas que vas a utilizar en caso de que no las utilices todas. Por ejemplo, si solamente vas a utilizar las acciones index
y show
deberás definir la ruta del resource controller de la siguiente manera:
Route::resource('users', 'UsersController')->only([
'index', 'show'
]);
Si por el contrario necesitas definir cuáles no vas a utilizar basta cambiar el el método only
por except
.
Route::resource('users', 'UsersController')->except([
'create', 'store', 'update', 'destroy'
]);
Espero que hayas aprendido un poco más con este post y que puedas implementar lo más pronto posible este tipo de controladores en tus aplicaciones de laravel. Hasta pronto!.