Laravel 5, parte 5: Controladores y Rutas

Bueno, en esta ocasión vamos a continuar con nuestro proyecto, creando las acciones de nuestra aplicaciones para administrar las tareas de los usuarios.

Controladores

Un controlador es una clase que permite agrupar las acciones de una sección en particular. Por ejemplo podemos tener controladores como ProductosController, ContactoController, RegistroController. Y los métodos de por ejemplo ProductosController serían «crear», «modificar», «eliminar», «listar», etc.

Rutas

A la hora de administrar datos en particular, podemos crear un controlador y definir cada una de sus acciones dentro de routes/app.php de la siguiente forma:

Route::get('/home', 'MiControladorController@metodo');

Sin embargo, a medida que vaya creciendo el proyecto este archivo puede llenarse de líneas con todas las acciones de toda la aplicación.

Para resolver esto vamos a crear un resource indicando un controlador en particular, y Laravel se va a encargar en crear las acciones y enrutarlas.

Vamos a la consola y escribimos lo siguiente:

php artisan make:controller TareasController --resource

Si ahora vamos a app/Http, podemos observar que se creó nuestro controlador con los siguientes métodos:

  • index: Mostrar registros existentes (GET)
  • create: Mostrar nuevos datos a crear (GET)
  • store: Crear nuevos datos (POST)
  • show: Mostrar un registro (GET)
  • edit: Mostrar un registro a modificar (GET)
  • update: Modificar un registro (PUT)
  • destroy: Eliminar un registro (DELETE)

Los métodos GET nos van a permitir recuperar datos de la base de datos, y mostrarlos con una interfaz al usuario. Mientras que los otros son acciones que nos van a permitir realizar acciones en la base de datos, tanto de INSERT, UPDATE y DELETE. POST para crear nuevos registros, PUT para modificar registros que ya existente y finalmente DELETE para eliminarlos.

Como para adelantar un poco, el método create(), que se accede por GET, nos va a mostrar el formulario para crear nuevas tareas, mientras que store(), que se accede por POST, será el que nos permita recuperar los datos enviados del anterior y guardarlo en la base de datos.

Ahora para que este controlador pueda ser accedido, tenemos que agregarlo dentro de: routes/web.php:

Route::resource('/tareas', 'TareasController');

El problema que se presenta acá es que para acceder a esa url: ‘tareas’, tenemos que estar autentificados, así que para evitar que visitantes sin usuario accedan, deberíamos cambiarlo por lo siguiente:

Route::group( ['middleware' => 'auth' ], function()
{
   Route::resource('/tareas', 'TareasController'); 
});

Ahora vamos a agregarle el código a nuestras acciones, dentro del archivo TareasController:

use Auth;

Para usar la autentificación, recordemos que para acceder a esta clase, el usuario debe estar autentificado.

use App\User;
use App\Tarea;
use App\Estado;

Para poder usar los modelos.

use Illuminate\Support\Facades\Redirect;

Esta librería nos permitirá hacer redireccionamiento de nuestras acciones.

(Todos los use antes de declarar class)

Y ahora nos toca agregar el código para que funcionen las acciones.

El método index() tendrá el siguiente código:

public function index()
{
   $tareas = Tarea::all();
}

Mediante all() podemos recuperar todas las tareas que existen. Sin embargo, tratándose de las tareas de un usuario en particular tendremos que modificar de modo que sólo nos traiga las tareas de un usuario. Entonces reemplazamos el código por esto:

$tareas = User::find(Auth::id())->tareas;

El método id() de la clase Auth (clase de autentificación), nos va a devolver el id del usuario que inicio sesión.

Ahora create(), que es donde vamos a cargar posteriormente nuestro formulario para guardar una nueva tarea, tendrá el siguiente código:

public function create()
{
   $tarea = new Tarea();
   $estados = Estado::all();
}

En este caso sí usamos el método all() porque necesitamos todos los registros de una tabla.

Y los datos serán enviados al método store():

public function store(Request $request)
{
   //Crear tarea nueva.
   $tarea = new Tarea();
   $tarea->titulo = $request->titulo;
   $tarea->descripcion = $request->descripcion;
   $tarea->estado_id = $request->estado_id;
   $tarea->user_id = Auth::id();
   $tarea->save();
   //Redirigir a la lista de tareas.
   return Redirect::to('tareas')->with('notice', 'Tarea guardada correctamente.');
}

La clase Request nos permite recuperar los datos enviados por un usuario, creamos una nueva instancia de Tarea, le agregamos los datos correspondientes enviados por el usuario y finalmente usamos el método save() para guardar la tarea. Con respecto a la última línea, es sólo un redireccionamiento a la lista de tareas del usuario.

En show() simplemente recuperamos una tarea por su id, el cuál se pasa como parámetro:

public function show($id)
{
   $tarea = Tarea::find($id);
}

La acción edit() va a ser similar a create(), sólo que en lugar de crear un nuevo objeto Tarea, vamos a recuperar uno por su id:

public function edit($id)
{
   $tarea = Tarea::find($id);
   $estados = Estado::all();
}

Y al enviar los datos desde esta acción van a modificarse con los datos del id:

public function update(Request $request, $id)
{
   $tarea = Tarea::find($id);
   $tarea->titulo = $request->titulo;
   $tarea->descripcion = $request->descripcion;
   $tarea->estado_id = $request->estado_id;
   $tarea->user_id = Auth::id();
   $tarea->save();
   return Redirect::to('tareas')->with('notice', 'Tarea guardada correctamente.');
}

Vemos que a diferencia del método create(), no hacemos un new para crear una nueva instancia, sino que recuperamos el objeto completo con find($id) y luego modificamos los valores del registro. Por último también haremos una redirección a la lista de tareas.

Finalmente creamos el último método que es destroy(), el cual nos va a permitir eliminar un registro:

public function destroy($id)
{
   $tarea = Tarea::find($id);
   $tarea->delete();
}

Simplemente recuperamos el registro por su id, y finalmente lo eliminamos con el método delete().

Lo último que tendríamos que cambiar, es que:

$tarea = Tarea::find($id);

Nos va a traer una tarea por su id, sin embargo, teniendo en cuenta que cada tarea le va a pertenecer a otro usuario, y no debería ser accedida por otro, deberíamos reemplazar esa línea por lo siguiente:

$tarea = Tarea::where(array(
   'id' => $id,
   'user_id' => Auth::id()
))->first();

Bueno, en la próxima publicación vamos a corregir el código para agregar los formularios correspondientes y así darle una interfaz gráfica a nuestra aplicación.

 

Anterior: Laravel 5, parte 4: Modelos y relaciones

Siguiente: Laravel 5, parte 6: Vistas y Helpers

 

Descargar ejemplo completo