Laravel, parte 6: Controladores

Hasta ahora hemos aprendido cómo hacer routing mediante una ruta y una acción que se disparará cada vez que se llama a esa ruta en la url de nuestra aplicación, todo esto gracias al archivo routes.php. Sin embargo, a medida que el desarrollo vaya creciendo, ese archivo será cada vez más grande, y no es buena idea meter todas las acciones de la aplicación como si fuese una gran bolsa de gatos. Pensá en todas las acciones que puede haber. Por ejemplo en nuestro caso vamos a necesitar más adelante la posibilidad de crear, modificar, eliminar y mostrar usuarios, y no sólo tendremos usuarios, también podemos tener otro tipo de contenido en nuestra base de datos. Ya con todas estas cosas, convertirán a nuestro archivo routes.php en un verdadero caos,difícil de mantener con el tiempo e ilegible, y sin contar que puede haber muchos desarrolladores trabajando esta aplicación.

Para evitar esto, debemos encapsular o separar nuestro código en distintos módulos, que a su vez tendrán distintas partes. Para ello serán los controladores.

Los controladores representan una parte de nuestra aplicación representados con clases, que a su vez estarán divididos en acciones, representados como métodos. Por ejemplo, podríamos tener un controlador Producto, que tengas distintos métodos o acciones para insertar un nuevo producto, modificar un producto ya existente, eliminarlo, mostrarlos productos en grupo o de a uno. De esta manera nosotros definiremos en nuestro archivo routes.php cuáles serán los controladores de nuestra aplicación y los mismos se harán cargo de las acciones que cada uno tendrá consigo.

Para crear nuestro primer controlador vamos a ir dentro de nuestra aplicación a app -> controllers y vamos a crear un archivo llamado TestController.php. Este archivo contendrá una clase con el nombre del controlador, así que lo editaremos con el siguiente código:

<?php
 class TestController extends BaseController {
 }
?>

Bien, el nombre de nuestro controlador debe escribirse con mayúscula (como toda clase) y debe finalizar con la palabra “Controller”. Además deberá heredar de una clase de Laravel llamada BaseController, que ya veremos más adelante.

Las url de Laravel mediante controladores y acciones se representan de la siguiente forma:

https://mipagina/controlador/accion

Para ello vamos a crear nuestra primer acción, vale aclarar que éstas deben llamarse con la palabra “get” adelante y el nombre de la acción:

<?php
 class TestController extends BaseController {
    public function getIndex(){
       return 'Bienvenido a nuestro primer controlador';
    }
 }
?>

Bien, ahora vamos a ir a nuestro archivo routes.php, en app -> routes.php y vamos a escribir lo siguiente:

Route::controller('test', 'TestController');

(Si, ya había una acción con la ruta ‘test’ deberíamos eliminarla)

Como se ve en el ejemplo A través de la clase Route llamamos al método controller() que nos permitirá agregar nuestro controlador, que estará disponible a partir de la ruta ‘test’. Este método recibe dos parámetros, el nombre de la ruta y del controlador.

Ahora simplemente vamos a iniciar nuestro servidor, si es que no lo hemos hecho algún, y vamos a abrir nuestro navegador para escribir la siguiente url:

https://localhost:8000/test/index

Como habíamos dicho antes, primero llamamos al nombre del controlador, y luego el nombre del método.

Sin embargo, el nombre getIndex() no es un método que yo haya llamado al azar, este nombre tiene un sentido en Laravel, ya que representa a la acción principal del controlador. Con esto me refiero a que en la url de nuestra aplicación llamamos al controlador, pero sin el método, Laravel cargará este método por defecto, el método getIndex().

Por tanto hacer esto:

https://localhost:8000/test/index

Es lo mismo que hacer esto:

https://localhost:8000/test

Ambos llamarán al método getIndex().

También podemos crear otro método, por ejemplo uno que nos muestre los nombres de los usuarios:

<?php
 class TestController extends BaseController {
    public function getIndex(){
       return 'Bienvenido a nuestro primer controlador';
    }
    public function getUsuarios(){
       $users = User::all();
       $real_names = '';
       foreach($users as $item){
          $real_names .= "{$item->real_name} <br />";
       }
       return $real_names;
    }
 }
?>

La acción getUsuarios() es similar a una acción que habíamos creado en la publicación pasada y nos devolverá los nombre de los usuarios de la lista. Esto es una breve introducción de lo que dijimos hace un tiempo, de cómo los controladores interactúan con los modelos, que son los encargados de consultar con la base de datos.

Para acceder a esa acción obviamente debemos ingresar a la siguiente url:

https://localhost:8000/test/usuarios

También podemos pasar valores dinámicos a través de la url, por ejemplo un id para buscar un registro. En este caso la url del controlador tendrá un aspecto como éste:

https://mipagina/controlador/accion/parametro

Así que podemos crear una acción y agregarla a la clase:

<?php
class TestController extends BaseController {
   public function getIndex() {
      return 'Bienvenido a nuestro primer controlador';
   }
   public function getUsuarios() {
      $users = User::all();
      $real_names = '';
      foreach ($users as $item) {
         $real_names .= "{$item->real_name} <br />";
      }
      return $real_names;
   }
   public function getUsuario($id){
      $user = User::find($id);
      return "{$user->real_name} / {$user->email}";
   }
}
?>

En este caso, la acción getUsuario() recibirá como parámetro un id y devolverá el real_name y el email del usuario al que le pertenece ese id. Para probarlo podemos ir a la siguiente url:

https://localhost:8000/test/usuario/1

Bien, con esto terminamos nuestra introducción a los controladores. Más adelante podremos ver más ejemplo, y como trabajan en conjuntos con los modelos y las vistas.

Saludos!

Anterior: Laravel, parte 5: Modelos

Siguiente: Laravel, parte 7: Vistas

 

Redes sociables

    16 Replies to “Laravel, parte 6: Controladores”

    1. Hoy es el primer día que me siento a ver LARAVEL y la verdad que increible tu tutorial!! muchas gracias por compartirlo. cualquier consulta que tenga te lo puedo preguntar no? nuevamente gracias y saludos.

      1. No, es simplemente un ejemplo de cómo definir un url y la acción que se realiza al ingresar a esa url.

        Saludos!

    2. No me funciona … hasta copie las mismas instrucciones de la presentación de todos los usuarios creados en la base de datos y me aparece el siguiente mensaje cuando llamo a:http://localhost:8000/test/usuarios

      Whoops, looks like something went wrong.

      Cual puede ser el error ???

      1. La ruta la definiste en el archivo routes.php:

        Route::controller(‘test’, ‘TestController’);

    3. Estimado,
      Tengo el siguiente problema, en una hoja en donde listo una cantidad de modelos (tabla hijo) asociados a marcas (tabla padre), trato de hacer un link para que muestre el detalle del modelo (computadores).
      genero el links con el siguiente código y me da error:

      route(‘admin.modelos.show’, array($mmodelo->cd_modelo))

      Sin embargo,
      Al colocar el siguiente código no me da error, pero claramente no llama a método que requiero.
      route(‘admin.marcas.show’, array($mmodelo->cd_modelo))

      ambos controladores existen, pero al invocar al controlador de modelos me arroja el error.
      Gracias por la ayuda

      1. Disculpame, no termino de entender lo que necesitas hacer. Vos tenés que listar varios registros, que son computadoras, y necesitás hacer un join con la marca de cada una de esas computadoras?

    4. Muy buenas Fernando,
      Tengo una consulta con respecto al servido local. Yo tengo en mi maquina instalado wamp. Y hasta dentro de este he ido haciendo los ejemplos que has ido proponiendo en tu tutorial (por cierto, muy muy bueno. Enhorabuena!!) y mi pregunta es: ¿por qué solo puedo acceder al proyecto laravel a través del servidor creado con artisan? es decir, si accedo a través “localhost:8000”. Todo funciona perfectamente. Pero si lo hago a traves de “localhost/laravel” A lo unico que accedo es a la pagina de “You have arrived.”
      Muchas gracias de antemano y enhorabuena de nuevo por tu magnífico tutorial.

      1. En realidad es una configuración propia Laravel, donde la url hace referencia a los controladores y sus acciones, y no a una ruta de tu proyecto.

        Yo nunca lo probé con localhost/proyecto, o mejor dicho sí lo sí, pero me dio muchos dolores de cabeza, entonces seguí lo que decía la documentación de Laravel.

        Saludos!

    Comments are closed.