Вы находитесь на странице: 1из 6

Cursos online de Mejorando.

la

2.4 - Controladores y MVC con Laravel


Hoy quiero que aprendamos sobre loscontroladores con Laravel. Cuando se habla delpatrn 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 patrn MVC (por
ejemplo: en la carpeta apps/ encontramos las sub-carpetas
controllers/ models/ y views/. Ms adelante hablar de MVC -pros y contras- en detalle.

Qu son los controladores?


Imaginen que en vez de una aplicacin web estamos liderando un restaurante. Los
comensales(Usuarios)son recibidos por nuestro anfitrin Laravel.Laravelse encarga de llevarlos dentro
del restaurante(Aplicacin)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 estacin adecuada. Por ejemplo: si ordeno cocteles nuestro
mesonero (ruta) llevar el pedido (request) al bar, si ordeno una pasta con albndigas dicho pedido ser

llevado por el mesonero (ruta) a la estacin de cocina italiana.


En este ejemplo, losControladoresson los encargados de cada estacin (bar, comida italiana, comida
mexicana, etc.).
Por ejemplo, nuestro maestro de cocina italiana que acaba de recibir el pedido de albndigas y pasta, es un
controlador.
De
qu se encargar? De cocinar? Absolutamente NO! El controlador solamente debe encargarse de

dirigir la operacin. 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 cdigo,so, here we go:
Cdigo :
<?php
//app/routes.php
Route::get('pasta-with-meatballs/{id_table}, {type}', array('as' => 'pasta_meatballs',
'uses' => 'ItalianController@pastaWithMeatBalls'))->where(id_table, [0-9]+);

Cdigo :
<?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.]

Cursos online de Mejorando.la

$this->sauceRepo = $sauce;
}
public function pastaWithMeatballs($idTable, $type = long)
{
// Si el usuario pidi pasta larga cocinaremos espaguetis
if ($type == long)
{
$pasta = $this->pastaRepo->cookSpaghetti();
}
// Si el usuario pidi pasta corta cocinaremos rigatonis
else if ($type == short)
{
$pasta = $this->pastaRepo->cookRigatoni();
}
else
{
return Redirect::route(table, array($idTable)->with(message, Por favor
elija pasta corta o pasta larga);
}
$meatBalls = $this->meatRepo->cookMeatBalls();
$napoliSauce = $this->sauceRepo->cookNapoliSauce();

$food = compact(pasta, meatBalls, napoliSauce);

return View::make(dishes/italian, $food);


}

Interesante, no? Lamentablemente ni Laravel ni PHP pueden preparar comida por nosotros, esosera
genial,
pero si leyeron en detalle el cdigo descrito arriba y lo entienden han dado un gran paso para ser
buenoschefs, quiero decir, programadores en Laravel.
Examinemos el cdigo:

Cmo darle nombre a una ruta y enlazarla a un controlador


Cdigo :
Route::get('pasta-with-meatballs/{id_table}/{type}', array('as' => 'pasta_meatballs',
'uses' => 'ItalianController@pastaWithMeatBalls'))->where(id_table, [0-9]+);

Fjense que ya el segundo parmetro no es una funcin annima,como en los ejemplos anteriores.
Ahora es unarray:
El parmetro as define el nombre de la ruta, suponiendo que escribimos nuestra vista
views/menu.blade.php podremos colocar el enlace a nuestra ruta as:
Cdigo :
<!-- app/views/menu.blade.php -->
<ul>
<li><a href={{ route(pasta_meatballs, array($idTable, long)) }}>Pasta larga</a>
</li>
<li><a href={{ route(pasta_meatballs, array($idTable, short)) }}>Pasta corta</a>
</li>
</ul>

O un redirect:
Cdigo :

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

Cursos online de Mejorando.la

Redirect::route(pasta_meatballs)

El nombre de la rutaNO es la URLDe


hecho, ms adelante podramos cambiar la URL a pasta-conalbondigas y el men y el Redirect seguirn funcionando como si nada. Bastante til.
El parmetro usesdefine el controlador y la accin que se van a usar, separados por una arroba:
Cdigo :
'ItalianController@pastaWithMeatBalls'

Composer y Laravel saben cmo cargar nuestros controladores y otras clases. Ms adelante hablaremos
delAutoloaderde 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 Estacin de comida italianaItalianControllery
asignar los chefs
(clases, repositorios) para la pasta, la carne y la salsa, y una vez que est todo listo llamar a la funcin /
accinpastaWithMeatBalls.

Cmo funciona un constructor en los controladores de Laravel


Revisemos de nuevo el constructor de nuestra clase ItalianController:
Cdigo :
public function __construct(PastaRepoInterface $pasta, MeatRepoInterface $meat,
SauceRepoInterface $sauce)
{
$this->pastaRepo = $pasta;
$this->meatRepo = $meat;
$this->sauceRepo = $sauce;
}

Un constructor es unmtodo especial de PHPque se llama cada vez quecreamos un objeto


Pero de dnde salen esos parmetros $pasta, $meat, $sauce?
Laravel
los crea y asigna por nosotros automticamente!, siempre que las
interfaces existan y haya al
menos una clase que implemente dicha interfaz. Lo nico que necesitamos hacer es decirle a Laravel qu
clases van a ser usadas por cada interfaz:
Cdigo :
// al final de app/start/globals.php agregaramos lo siguiente:
App::bind(PastaRepoInterface, PastaRepo);
App::bind(MeatRepoInterface, MeatRepo);
App::bind(SauceRepoInterface, SauceRepo);

En nuestra carpeta app/models/ podemos programar losrepositorios y modelosy tambin lasinterfaces

Qu es una Interfaz
Una interfaz, es como un contrato que permite definir los mtodos (funcionalidades)mnimosque una
clase debe tener. En s NO implementa cdigo, slo sirve paradefinir los requerimientos de las clases
de cierto tipo.
En nuestro ejemplo, los requisitos mnimos que nuestro restaurante exige para contratar a
un chef de pasta, seran:
Cdigo :

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

Cursos online de Mejorando.la

// app/models/PastaRepoInterface
interface PastaRepoInterface {
public function cookSpaghetti();
public function cookRigatoni();
public function cookLasagne();
}

Debe saber cmo preparar espagueti, rigatonis, y lasaa,why not?


Ahora si queremos crear un chef encargado de proveerle pasta a las cocinas escribiramos lo siguiente:
Cdigo :
// app/models/PastaRepo
class PastaRepo implements PastaRepoInterface {

public function cookSpaguetti()


{
return Pasta::where(type, =, spaguetti)->get();
}

public function cookRigatoni()


{
return Pasta::where(type, =, rigatoni)->get();
}

// Etc. Etc...
}

PastaRepoInterface es el contrato. PastaRepo es el chef que conoce las recetas.


Lo
interesante de este ejemplo es que si luego queremos cambiar nuestro especialista en pastas, slo
tendramos que regresar a app/start/globals.php y decirle a Laravel:
Cdigo :
//app/start/globals.php
App::bind(PastaRepoInterface, MongoPastaRepo);

Que ahora nuestro Chef de Pastas no serEloquentsinoMongo.


Siempre que el nuevo chefMongoPastaRepoimplemente la interfazPastaRepoInterfacenuestra cocina
seguir funcionandosin ningn tipo de cambio adicional.Genial No?
Por cierto,las recetasen este caso seran lalgica de nuestra aplicacino lgica de negocios. En este
caso todas las hemos puesto dentro de nuestra carpeta de modelos, como debe ser.

Vistas o Capa de Presentacin


Una vez que el controlador ItalianController obtiene toda la comida necesaria para crear nuestra pasta con
albndigas:
Cdigo :
$food = compact(pasta, meatBalls, napoliSauce);

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

Cursos online de Mejorando.la

Esta
se pasa a la vista, que en nuestro ejemplo sera la estacin encargada de decorar el plato para que no
slo tenga la comida(data)adecuada sino que luzca bien(diseo, layouts, HTML5).
Perono siempre necesitaremos una capa de presentacin.
Qu pasa si el usuario pide su comida
para llevar, por ejemplo? Slo habra que entregarla en un envase, sin platos, sin adornos,sin HTML, A
qu les recuerda eso? Cuando hacemos una peticinAJAX, el servidor simplemente nos devuelve los
datos en formatoJSON:
Cdigo :
return Response::json($food);

Cmo redirigir una accin a otra ruta


Fjense qu pasa si el tipo de pasta ($type) solicitado no es long ni short:
Cdigo :
return Redirect::route(table, array($idTable))->with(message, Por favor elija pasta
corta o pasta larga);

De
una manera muy sencilla le decimos a Laravel que redirija la peticin del usuario de nuevo a su mesa,
donde le pediremos que por favor elija pasta corta o larga.
Por supuesto necesitaramos definir otra ruta:
Cdigo :
//app/routes.php
// [More code here]
Route::get(table/{id}, array(as => table, uses => tableController@index))>where(id, [0-9]+); //etc

Conclusin
En
este captulo y con un ejemplo sencillo aprendimos qu son los controladores, cmo se crean y usan en
Laravel, tambin aprendimos cmo enlazar las rutas a ellos y aprendimos sobre Repositorios e Interfaces
que mantienen la lgica y responsabilidades de nuestra aplicacin separadas, como debe ser. Tambin le
dimos un vistazo a cmo trabajar con vistas, redirecciones y JSON.
En los prximos captulos ir detallando todo lo anterior.
Como
ltima nota, quizs algunos lectores estn pensando algo como: Pero yo no necesito unrestaurante

oaplicacin tan elegante. Yo hago pginas web mssencillas.


Con Laravel podramos hacer esto:
Cdigo :
// app/routes.php
Route::get(pasta-with-meatballs, function () {
$pasta = Pasta::where(type, =, short)->get();
// Etc. Etc.

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

Cursos online de Mejorando.la

return View::make(dish, array($pasta));


});

Para
qu crear un controlador y luego una interfaz y un repositorio y
etc. etc. si se puede hacer todo tan
rpido y fcil?
Tienen
razn, eso tambin funciona, como uno de esos puestos de comida rpida que son atendidos por
una o dos personas que te dan
la bienvenida, preparan la comida, te sirven y te cobran y limpian las

mesas eso funciona. Pero si quieren ser programadores de alta categora, lo mejor es que aprendan y
usenlas mejores prcticas de desarrolloen
el lenguaje y framework en el cual se desempeen... Esto es
un poco de lo que quiero lograr con Laravel y estos captulos: que aprendan Laravel pero aprendan bien.
No subestimen sus proyectos, no subestimen a sus clientes y sobretodo no se subestimen a uds. mismos.
Como siempre todas sus impresiones, dudas, preguntas, aportes, en los comentarios, por favor

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

Вам также может понравиться