You are on page 1of 6

Cursos online de Mejorando.

la

2.4 - Controladores y MVC con Laravel
Hoy quiero que aprendamos sobre los controladores con Laravel. Cuando se habla del patrón MVC
(Modelo-Vista-Controlador) se dice que:
Un controlador es la capa intermediaria encargada de invocar a los modelos y pasar datos a las vistas
Laravel es compatible con el patrón MVC (por
ejemplo: en la carpeta apps/ encontramos las sub-carpetas
controllers/ models/ y views/. Más adelante hablaré de MVC -pros y contras- en detalle.

¿Qué son los controladores?
Imaginen que en vez de una aplicación web estamos liderando un restaurante. Los
comensales (Usuarios) son recibidos por nuestro anfitrión Laravel. Laravel se encarga de llevarlos dentro
del restaurante (Aplicación) donde los esperan los mesoneros (Rutas).
Cada mesonero (Ruta) se encarga de tomar nota del pedido (Solicitud o Request) de cada
comensal (Usuario) y
de dirigirlo a la estación adecuada. Por ejemplo: si ordeno cocteles nuestro
mesonero (ruta) llevará el pedido (request) al bar, si ordeno una pasta con albóndigas dicho pedido será

llevado por el mesonero (ruta) a la estación de cocina italiana.
En este ejemplo, los Controladores son los encargados de cada estación (bar, comida italiana, comida
mexicana, etc.).
Por ejemplo, nuestro maestro de cocina italiana que acaba de recibir el pedido de albóndigas y pasta, es un
controlador.
¿De
qué se encargará? ¿De cocinar? ¡Absolutamente NO! El controlador solamente debe encargarse de

dirigir la operación. Por eso, debe disponer de un grupo de chefs (Repositorios o Modelos) a su cargo y
solicitar a cada uno lo que corresponda.
Ok, sé que quieren aprender a programar, sé que quieren ver código, so, here we go:
Código :
<?php
//app/routes.php
Route::get('pasta-with-meatballs/{id_table}, {type}', array('as' => 'pasta_meatballs',
'uses' => 'ItalianController@pastaWithMeatBalls'))->where(‘id_table’, ‘[0-9]+’);

Código :
<?php
//app/controllers/ItalianController.php
class ItalianController extends KitchenController {
   protected $pastaRepo;
   protected $meatRepo;
   protected $sauceRepo;
   public function __construct(PastaRepoInterface $pasta, MeatRepoInterface $meat,
SauceRepoInterface $sauce)
   {
      $this->pastaRepo  = $pasta;
      $this->meatRepo   = $meat;

https://cursos.mejorando.la/cursos/php-laravel/concepto/clase-4/controladores-y-mvc-con-laravel/[11/08/2014 02:41:35 p.m.]

array($idTable)->with(‘message’.m.    }    public function pastaWithMeatballs($idTable.       }       // Si el usuario pidió pasta corta cocinaremos rigatonis       else if ($type == ‘short’)       {          $pasta = $this->pastaRepo->cookRigatoni().la/cursos/php-laravel/concepto/clase-4/controladores-y-mvc-con-laravel/[11/08/2014 02:41:35 p. ‘napoliSauce’). ‘short’)) }}”>Pasta corta</a> </li> </ul> O un redirect: Código : https://cursos.       $napoliSauce = $this->sauceRepo->cookNapoliSauce(). ‘long’)) }}”>Pasta larga</a> </li> <li><a href=”{{ route(‘pasta_meatballs’. $food). 'uses' => 'ItalianController@pastaWithMeatBalls'))->where(‘id_table’.Cursos online de Mejorando.         }     $food = compact(‘pasta’.mejorando. eso sería genial. Fíjense que ya el segundo parámetro no es una función anónima.la       $this->sauceRepo = $sauce.php --> <ul> <li><a href=”{{ route(‘pasta_meatballs’. pero si leyeron en detalle el código descrito arriba y lo entienden han dado un gran paso para ser buenos chefs. array('as' => 'pasta_meatballs'.app/views/menu. como en los ejemplos anteriores.       return View::make(‘dishes/italian’. ‘meatBalls’.  } ¿Interesante. quiero decir. suponiendo que escribimos nuestra vista views/menu.       }       $meatBalls = $this->meatRepo->cookMeatBalls().blade. array($idTable. ‘Por favor elija pasta corta o pasta larga’).       }       else       {          return Redirect::route(‘table’. ‘[0-9]+’).blade.] . programadores en Laravel.php podremos colocar el enlace a nuestra ruta así: Código : <!-. Ahora es un array: El parámetro “as” define el nombre de la ruta. $type = ‘long’)    {       // Si el usuario pidió pasta larga cocinaremos espaguetis       if ($type == ‘long’)       {          $pasta = $this->pastaRepo->cookSpaghetti(). array($idTable. Examinemos el código: Cómo darle nombre a una ruta y enlazarla a un controlador Código : Route::get('pasta-with-meatballs/{id_table}/{type}'. no? Lamentablemente ni Laravel ni PHP pueden preparar comida por nosotros.

‘SauceRepo’). siempre que las interfaces existan y haya al menos una clase que implemente dicha interfaz. es como un contrato que permite definir los métodos (funcionalidades) mínimos que una clase debe tener. repositorios) para la pasta. En nuestro ejemplo. serían: Código : https://cursos. Más adelante hablaremos del Autoloader de Composer Entonces una vez que nuestro usuario haga click en los ítems “Pasta larga” o “Pasta corta” de nuestro menú Laravel armará por nosotros la Estación de comida italiana ItalianController y asignará los chefs (clases. $meat.       $this->sauceRepo = $sauce. ‘PastaRepo’).la/cursos/php-laravel/concepto/clase-4/controladores-y-mvc-con-laravel/[11/08/2014 02:41:35 p.Cursos online de Mejorando. El parámetro ‘uses’define el controlador y la acción que se van a usar . En sí NO implementa código. Lo único que necesitamos hacer es decirle a Laravel qué clases van a ser usadas por cada interfaz: Código : // al final de app/start/globals. App::bind(‘SauceRepoInterface’.mejorando. más adelante podríamos cambiar la URL a “pasta-conalbondigas” y el menú y el Redirect seguirán funcionando como si nada.    } Un constructor es un método especial de PHP que se llama cada vez que creamos un objeto ¿Pero de dónde salen esos parámetros $pasta. Bastante útil. Cómo funciona un constructor en los controladores de Laravel Revisemos de nuevo el constructor de nuestra clase ItalianController: Código :    public function __construct(PastaRepoInterface $pasta. MeatRepoInterface $meat. $sauce? ¡Laravel los crea y asigna por nosotros automáticamente!. SauceRepoInterface $sauce)    {       $this->pastaRepo  = $pasta.] . los requisitos mínimos que nuestro restaurante exige para contratar a un chef de pasta. la carne y la salsa.m. separados por una arroba: Código : 'ItalianController@pastaWithMeatBalls' Composer y Laravel saben cómo cargar nuestros controladores y otras clases. y una vez que esté todo listo llamará a la función / acciónpastaWithMeatBalls. App::bind(‘MeatRepoInterface’. En nuestra carpeta app/models/ podemos programar los repositorios y modelos y también las interfaces Qué es una Interfaz Una interfaz.php agregaríamos lo siguiente: App::bind(‘PastaRepoInterface’.       $this->meatRepo   = $meat. sólo sirve para definir los requerimientos de las clases de cierto tipo.la Redirect::route(‘pasta_meatballs’) El nombre de la ruta NO es la URL De hecho. ‘MeatRepo’).

   public function cookRigatoni().php App::bind(‘PastaRepoInterface’.  }          public function cookRigatoni()  {     return Pasta::where(‘type’. } PastaRepoInterface es el contrato. ‘=’.. y… lasaña.m. Genial ¿No? Por cierto. En este caso todas las hemos puesto dentro de nuestra carpeta de modelos. ‘rigatoni’)->get().php y decirle a Laravel: Código :  //app/start/globals. Etc.la/cursos/php-laravel/concepto/clase-4/controladores-y-mvc-con-laravel/[11/08/2014 02:41:35 p. ‘napoliSauce’).. } Debe saber cómo preparar espagueti. https://cursos.  } // Etc.mejorando. Vistas o Capa de Presentación Una vez que el controlador ItalianController obtiene toda la comida necesaria para crear nuestra pasta con albóndigas: Código :     $food = compact(‘pasta’. sólo tendríamos que regresar a app/start/globals. ‘=’. Que ahora nuestro Chef de Pastas no será Eloquent sino Mongo. ‘meatBalls’. why not? Ahora si queremos crear un chef encargado de proveerle pasta a las cocinas escribiríamos lo siguiente: Código : // app/models/PastaRepo class PastaRepo implements PastaRepoInterface {          public function cookSpaguetti()  {     return Pasta::where(‘type’. PastaRepo es el chef que conoce las recetas. Lo interesante de este ejemplo es que si luego queremos cambiar nuestro especialista en pastas. rigatonis.Cursos online de Mejorando.la // app/models/PastaRepoInterface interface PastaRepoInterface {    public function cookSpaghetti(). las recetas en este caso serían la lógica de nuestra aplicación o lógica de negocios.] . ‘spaguetti’)->get(). ‘MongoPastaRepo’). Siempre que el nuevo chef MongoPastaRepo implemente la interfaz PastaRepoInterface nuestra cocina seguirá funcionando sin ningún tipo de cambio adicional.    public function cookLasagne(). como debe ser.

Etc….Cursos online de Mejorando. ‘[0-9]+’). Como última nota. ‘=’.m. que en nuestro ejemplo sería la estación encargada de decorar el plato para que no sólo tenga la comida (data) adecuada sino que luzca bien (diseño. como debe ser. array(‘as’ => ‘table’. también aprendimos cómo enlazar las rutas a ellos y aprendimos sobre Repositorios e Interfaces que mantienen la lógica y responsabilidades de nuestra aplicación separadas. ‘Por favor elija pasta corta o pasta larga’). ¿Qué pasa si el usuario pide su comida para llevar.] . sin adornos. También le dimos un vistazo a cómo trabajar con vistas. sin HTML. // Etc. el servidor simplemente nos devuelve los datos en formato JSON: Código : return Response::json($food).php Route::get(‘pasta-with-meatballs’. sin platos. //etc… Conclusión En este capítulo y con un ejemplo sencillo aprendimos qué son los controladores. quizás algunos lectores estén pensando algo como: “Pero yo no necesito un restaurante o aplicación tan elegante. donde le pediremos que por favor elija pasta corta o larga.php // [More code here] Route::get(‘table/{id}’. function () {    $pasta = Pasta::where(‘type’. HTML5). Pero no siempre necesitaremos una capa de presentación.la/cursos/php-laravel/concepto/clase-4/controladores-y-mvc-con-laravel/[11/08/2014 02:41:35 p. Con Laravel podríamos hacer esto: Código : // app/routes. En los próximos capítulos iré detallando todo lo anterior. Cómo redirigir una acción a otra ruta Fíjense qué pasa si el tipo de pasta ($type) solicitado no es long ni short: Código : return Redirect::route(‘table’.la Esta se pasa a la vista. layouts.mejorando. redirecciones y JSON. por ejemplo? Sólo habría que entregarla en un envase. https://cursos. array($idTable))->with(‘message’. ‘uses’ => ‘tableController@index’))>where(‘id’. cómo se crean y usan en Laravel. Por supuesto necesitaríamos definir otra ruta: Código : //app/routes. ‘short’)->get(). De una manera muy sencilla le decimos a Laravel que redirija la petición del usuario de nuevo a su mesa. ¿A qué les recuerda eso? Cuando hacemos una petición AJAX. Yo hago páginas web más sencillas.

etc.. si se puede hacer todo tan rápido y fácil? Tienen razón. aportes. preguntas.. }). Como siempre todas sus impresiones. Pero si quieren ser programadores de alta categoría. mismos.m.la return View::make(‘dish’.] . en los comentarios. ¿Para qué crear un controlador y luego una interfaz y un repositorio y etc. lo mejor es que aprendan y usen las mejores prácticas de desarrollo en el lenguaje y framework en el cual se desempeñen. No subestimen sus proyectos. no subestimen a sus clientes y sobretodo no se subestimen a uds.Cursos online de Mejorando. te sirven y te cobran y limpian las mesas… eso funciona. dudas. por favor  https://cursos. Esto es un poco de lo que quiero lograr con Laravel y estos capítulos: que aprendan Laravel pero aprendan bien. eso también funciona. preparan la comida.mejorando. array($pasta)). como uno de esos puestos de comida rápida que son atendidos por una o dos personas que te dan la bienvenida.la/cursos/php-laravel/concepto/clase-4/controladores-y-mvc-con-laravel/[11/08/2014 02:41:35 p.