Documentacion Laravel

download Documentacion Laravel

of 226

Transcript of Documentacion Laravel

  • 5/22/2018 Documentacion Laravel

    1/226

    Documentacion Laravel

    3.6-POO: Inyeccin de dependenciasen Laravel (IV)Esta es la cuarta partede la mini serie deinyeccin de dependencias en Laravel,leela primera,la segundayla terceraantes de continuar.

    Necesitas conocimientos bsicos de Laravel y POO para hacer este tutorial.

    Vimos en captulos anteriores que la inyeccin de dependencias, pese a su

    nombre complicado, es realmente un concepto simple que permite escribir objetosdesacoplados, es decir, que no sean dependientes uno del otro.

    La inyeccin de dependencias nos permite disear ORMs que en vez de estaratado a un solo motor de DB, reciban como parmetro clases MySQL o Postgresqlo incluso de MongoDB que funcionen siempre que cumplan con una interfaz.

    El contenedor de inyeccin de dependencias es como una mquina

    ensambladora que conecta una parte con otra y hace que todo el sistemafuncione.

    Tambin vimos que manipular las dependencias de nuestro sistema puede serdifcil, por eso el contenedor de Laravel es inteligente, y an as sigue siendosimple! Para demostrarlo les creun demo.

    Bien ahora dejmonos de demos y vamos a usar el contenedor real de Laravel!

    Para ensearles cmo usar la inyeccin de dependencias en Laravelnecesito 3pasos:

    Primero crearemos una clase de ejemplo y luego la integraremos con elcontenedor de Laravel.

    http://www.cristalab.com/tags/laravel/http://www.cristalab.com/tags/laravel/http://www.cristalab.com/tags/laravel/http://www.cristalab.com/tutoriales/poo-inyeccion-de-dependencias-c112370l/http://www.cristalab.com/tutoriales/poo-inyeccion-de-dependencias-c112370l/http://www.cristalab.com/tutoriales/poo-inyeccion-de-dependencias-c112370l/http://www.cristalab.com/tutoriales/poo-inyeccion-de-dependencias-ii-c112571l/http://www.cristalab.com/tutoriales/poo-inyeccion-de-dependencias-ii-c112571l/http://www.cristalab.com/tutoriales/poo-inyeccion-de-dependencias-ii-c112571l/http://www.cristalab.com/tutoriales/poo-inyeccion-de-dependencias-en-laravel-iii-c112574l/http://www.cristalab.com/tutoriales/poo-inyeccion-de-dependencias-en-laravel-iii-c112574l/http://www.cristalab.com/tutoriales/poo-inyeccion-de-dependencias-en-laravel-iii-c112574l/http://www.cristalab.com/tutoriales/poo-inyeccion-de-dependencias-en-laravel-iii-c112574l/http://www.cristalab.com/tutoriales/poo-inyeccion-de-dependencias-en-laravel-iii-c112574l/http://www.cristalab.com/tutoriales/poo-inyeccion-de-dependencias-en-laravel-iii-c112574l/http://www.cristalab.com/tutoriales/poo-inyeccion-de-dependencias-en-laravel-iii-c112574l/http://www.cristalab.com/tutoriales/poo-inyeccion-de-dependencias-en-laravel-iii-c112574l/http://www.cristalab.com/tutoriales/poo-inyeccion-de-dependencias-ii-c112571l/http://www.cristalab.com/tutoriales/poo-inyeccion-de-dependencias-c112370l/http://www.cristalab.com/tags/laravel/
  • 5/22/2018 Documentacion Laravel

    2/226

    Paso 1: Clase Alert de ejemplo

    Yo cre para uds. una mini versin de mi clase Alert que es un helper para enviarmensajes del controlador a las vistas, en mi caso uso losestilos de Bootstrappero

    es adaptable.

  • 5/22/2018 Documentacion Laravel

    3/226

    $messages = $this->session->get(static::SESSION_NAME,

    null);

    if($messages != null)

    {

    $this->session->flash(static::SESSION_NAME, null);

    return$this->view->make($template)->with('messages', $messages);

    }

    return"";

    }

    }

    Esta clase tiene dos mtodos: messagegraba mensajes y renderlos muestra.

    La clase usa la Sesin de Laravel para guardar mensajes entre una peticin y otray la clase de Vista para los templates.

    Para usarla:

    1. Dentro de app creen las carpetas y el archivo: app/library/Components/Alert.phpall copien y peguen el cdigo de arriba.2. Abran composer.json y en autoload -> classmap agreguen"app/library/Components" ejemplo:

    "autoload": {

    "classmap": [

    ...

    "app/library/Components"

    3. Ejecuten en la consola php artisan dump-autoload.4. En la carpeta app/views creen un archivo llamado alert.blade.php y copien losiguiente:

  • 5/22/2018 Documentacion Laravel

    4/226

    app/views/alert.blade.php

    @foreach($messages as$msg)

    {{ $msg['message'] }}

    @endforeach

    Esta es la plantilla que usar la clase Alert por defecto.

    Veamos un ejemplo de cmo usarla, en un mtodo cualquiera de un controladoragreguen esto:

    $alert = newComponents\Alert(App::make('session.store'),

    App::make('view'));

    $alert->message('Laravel es genial', 'info');

    Asignen la variable $alert a la vista:

    returnView::make('admin/users/list')->with('alert', $alert);

    Y en cualquier Vista simplemente:

    {{ $alert->render() }}

    Si usan una plantilla queimplemente Bootstrapvern un bonito mensaje en azulque dir Laravel es genial.

    Con esto terminamos el paso 1.

    http://www.cristalab.com/tutoriales/modulo-de-usuarios-ii-integra-bootstrap-con-laravel-c111641l/http://www.cristalab.com/tutoriales/modulo-de-usuarios-ii-integra-bootstrap-con-laravel-c111641l/http://www.cristalab.com/tutoriales/modulo-de-usuarios-ii-integra-bootstrap-con-laravel-c111641l/http://www.cristalab.com/tutoriales/modulo-de-usuarios-ii-integra-bootstrap-con-laravel-c111641l/
  • 5/22/2018 Documentacion Laravel

    5/226

    Paso 2: Usar el contenedor de inyeccin de dependencias de Laravel

    El cdigo anterior se enfrenta al menos a dos inconvenientes.

    1. Usarlo es complicado, es decir instanciar la clase, es demasiado cdigo y difcilde recordar:

    $alert = newComponents\Alert(App::make('session.store'),

    App::make('view'));

    De hecho podra ser peor, pero yo tom un atajo y us el contenedor de Laravel(alias App) para traerme la clase de session y la clase de view:

    App::make('session.store')

    De lo contrario hara falta instanciar esas clases y cada una de sus dependencias,lo cual podra volverse fcilmente unas 10 lneas de cdigo.

    2. La clase y variable $alert debe pasarse siempre a la vista, de lo contrarioobtendremos un error de que la variable no est definida.

    Con el contenedor de Laravel podemos resolver ambos problemas muyfcilmente:

    Usando los ServiceProvidersLaravel le llama Service Providers a las clases que almacenan la configuracin dela inyeccin de dependencias, son como los ensambladores de la aplicacin.

    1. Creen un archivo nuevo en app/library/Components/AlertProvider.php y pegueneste cdigo:

  • 5/22/2018 Documentacion Laravel

    6/226

    publicfunctionregisterAlert()

    {

    $this->app->bind('alert', function($app)

    {

    returnnewAlert($app['session.store'],

    $app['view']);

    });

    }

    }

    2. Ejecuten nuevamente php artisan dump-autoload.

    3. Vamos a decirle a Laravel que queremos incluir este ServiceProvider en nuestraApp, vamos a app/config/app.php y en el array providers agregaremos

    'Components\AlertProvider' a la lista:

    'providers'=> array(

    ...

    'Components\AlertProvider'

    ),

    4. Ya podemos instanciar nuestra clase Alert con el contenedor de dependencias!Es decir:

    $alert = App::make('alert');

    $alert->message('Laravel es genial', 'info');

    Paso 3: Uso de los Facades en LaravelAn App::make(alert) se ve algo extrao, no? A pesar de que es ms limpio, no

    sera mejor tener algo como Route::get ? De hecho Route::get es lo que TaylorOtwell llam facades.

    Creemos el nuestro:

    1. Creen el archivo app/library/Components/AlertFacade.php2. Y coloquen lo siguiente:

  • 5/22/2018 Documentacion Laravel

    7/226

  • 5/22/2018 Documentacion Laravel

    8/226

    publicfunctionregisterAlert()

    {

    $this->app->bind('alert', function($app)

    {

    returnnewAlert($app['session.store'],

    $app['view']);

    });

    }

    publicfunctionsetAliases()

    {

    $this->app->booting(function()

    {

    $loader = AliasLoader::getInstance();

    // Facades

    $loader->alias('Alert',

    'Components\AlertFacade');

    });

    }

    }

    3. No olviden ejecutar el dump-autoload.

    4. Una vez hecho estos tres pasos en nuestro controlador ya podemos usar elAlert as:

    Alert::message('Laravel es genial', 'info');

    Noten que NO estamos instanciando la clase, por lo tanto tampoco necesitamos lavariable $alert, en la vista queda as:

  • 5/22/2018 Documentacion Laravel

    9/226

    {{ Alert::render() }}

    Ms limpio y bonito imposible. Sin embargo noten que tampoco estamos haciendouso de clases estticas, lo cual es una mala prctica casi siempre, lo que ocurre

    es que el Facade se encarga de interactuar con el contenedor de inyeccin dedependencias de Laravel que a su vez instancia y almacena la clase por nosotros.

    Es decir, cada vez que haz hecho Route::get o View::make en realidad estabastrabajando con inyeccin de dependencias sin darte cuenta!.

    Les recomiendo seguir la documentacin de LaravelIoC ContaineryFacadespara

    aprender ms de estos geniales conceptos.

    http://laravel.com/docs/iochttp://laravel.com/docs/iochttp://laravel.com/docs/iochttp://laravel.com/docs/facadeshttp://laravel.com/docs/facadeshttp://laravel.com/docs/facadeshttp://laravel.com/docs/facadeshttp://laravel.com/docs/ioc
  • 5/22/2018 Documentacion Laravel

    10/226

    1 - Laravel, un framework PHPEl 2012 sirvi para ver como la oveja negra a PHP. Todos se deslumbraban connuevos lenguajes/paradigmas como Node.js, Ruby On Rails y dems. Si

    mencionabas PHP te comenzaban a ver como aquel hombre de 45 aos,divorciado, con un trozo de pizza en su escritorio y programando en COBOL.

    Es cierto que se resaltaron muchas de las carencias del tan popular PHP, peroeso lejos de matarlo, lo fortaleci. Se empez a trabajar en versiones mejoradas,se aprendi de los nuevos lenguajes y empezaron a llegar Frameworks de alto

    nivel, prcticos, fciles de usar y con un futuro muy prometedor.

    Laravel, un framework para PHP

    He trabajado en un par de proyectos utilizando elFramework de Laravel paraPHP, y el resultado hasta ahora ha sido fantstico. La curva de aprendizaje esrelativamente sencilla.Nunca antes haba sido tan fcil: asociar una ruta a uncontroller y a una vista,

    crear restful APIs est a dos pasitos,

    el ORM es tan prctico como cualquiera que se base en el patrn ActiveRecord...en s es un Framework muy bien diseado.

    http://www.cristalab.com/tags/php/http://www.cristalab.com/tags/php/http://www.cristalab.com/tags/php/http://www.cristalab.com/tags/php/http://www.cristalab.com/tags/php/http://www.cristalab.com/tags/php/
  • 5/22/2018 Documentacion Laravel

    11/226

    Laravel se basa en la elegancia y simpleza. Programar ya no tiene que ser tan

    doloroso y de hecho puede ser agradable con las herramientas

    necesarias. Laravel es una de esas herramientas.

    Est pensado para todos los programadores, inclusive los nuevos programadoresque estn iniciando con PHP, y ofrece grandes experiencias de desarrollo a losprogramadores avanzados.

    Gracias a la arquitectura nica de Laravel, posibilita a los desarrolladores a crear y

    disear su propia infraestructura para sus aplicaciones de la manera ms flexible.

    Para m,Laravel,es la bandera ms fuerte que me hace seguir apostando porPHP. Debo mencionar que he hecho proyectos con Node.js, y me parece muybueno, no estoy casado con ningn lenguage, simplemente creo que an haymuchas razones para seguir trabajando con PHP. Se habla mucho de de lasdiferencias de performance, en casos prcticos se invita a que se demuestre eso,por ejemplo,aquiNode.js tarda 0.389 seconds en procesar 1000 requests, encambio PHP 0.130 seconds.

    No dejen de leer este artculodonde dan mas detalles de las cosas buenas que sevienen para PHP.

    http://laravel.com/http://laravel.com/http://laravel.com/http://stackoverflow.com/questions/9846379/node-js-vs-php-processing-speedhttp://stackoverflow.com/questions/9846379/node-js-vs-php-processing-speedhttp://stackoverflow.com/questions/9846379/node-js-vs-php-processing-speedhttp://net.tutsplus.com/articles/editorials/why-2013-is-the-year-of-php/http://net.tutsplus.com/articles/editorials/why-2013-is-the-year-of-php/http://net.tutsplus.com/articles/editorials/why-2013-is-the-year-of-php/http://stackoverflow.com/questions/9846379/node-js-vs-php-processing-speedhttp://laravel.com/
  • 5/22/2018 Documentacion Laravel

    12/226

    4 - Cmo usar mltiples bases dedatos en Laravel

    Laravel hace posible la conexin a diferentes bases de datos de la manera msfcil posible, actualmente soporta los motores de base de datos mspopulares:MySQL, PostgreSQL, SQLite y SQLServer, y por eso nos hacesiempre felices.

    En aplicaciones y proyectos web sencillos es comn tener una conexin a unasola base de datos, la cual es ms que suficiente para almacenar y leer lainformacin administrada por nuestro proyecto. En aplicaciones web msrobustas, de mayor tamao o con requerimientos muy especiales surge lanecesidad de utilizar mltiples bases de datos, una para leer, otra para escribir la

    informacin o tal vez una base de datos que tiene algn propsito especial en otrosistema.

    Configuracin

    Primero que todo debemos realizar la configuracin de las conexiones, estaconfiguracin se hace en el archivoCdigo:

    app/config/database.php

    .En este archivo puedes establecer la configuracin para todas las bases de datosque necesites, de forma predeterminada Laravel provee cuatro configuracionesde ejemplopara cada uno de los motores de base de datos mencionados:

    Cdigo :

    'connections'=> array(

    'sqlite'=> array(

    'driver' => 'sqlite','database'=> __DIR__.'/../database/production.sqlite',

    'prefix' => '',

    ),

    'mysql'=> array(

    'driver' => 'mysql',

  • 5/22/2018 Documentacion Laravel

    13/226

    'host' => 'localhost',

    'database' => 'database',

    'username' => 'root',

    'password' => '',

    'charset' => 'utf8',

    'collation'=> 'utf8_unicode_ci','prefix' => '',

    ),

    'pgsql'=> array(

    'driver' => 'pgsql',

    'host' => 'localhost',

    'database'=> 'database',

    'username'=> 'root',

    'password'=> '',

    'charset' => 'utf8','prefix' => '',

    'schema' => 'public',

    ),

    'sqlsrv'=> array(

    'driver' => 'sqlsrv',

    'host' => 'localhost',

    'database'=> 'database',

    'username'=> 'root',

    'password'=> '','prefix' => '',

    ),

    ),

    Si necesitas una nueva conexin solo basta con aadirla al arreglo de conexionesy establecerle un nombre nico:

    Cdigo :

    'connections'=> array(

    'stark'=> array(

    'driver' => 'mysql',

    'host' => 'westeros',

    'database' => 'database',

  • 5/22/2018 Documentacion Laravel

    14/226

    'username' => 'JonSnow',

    'password' => 'Y0uN0th1ngJ0nS4nw',

    'charset' => 'utf8',

    'collation'=> 'utf8_unicode_ci',

    'prefix' => '',

    ),

    'lannister'=> array(

    'driver' => 'mysql',

    'host' => 'westeros',

    'database' => 'database',

    'username' => 'Joffrey',

    'password' => 'Wh0R3memb3rTh4atL1ttleB1tch?',

    'charset' => 'utf8',

    'collation'=> 'utf8_unicode_ci',

    'prefix' => '',),

    ),

    En el archivo de configuracin tambin se puede establecer la conexin de basede datos que se usar de forma predeterminada, es la opcin siguiente:Cdigo :

    'default'=> 'mysql'

    Uso de mltiples conexiones en Laravel

    El uso de diferentes conexiones es, como bien sabemos, muy fcil e intuitivo enLaravel:

    EsquemaPara definir el esquema de base de datos usa el mtodo:Cdigo :

    Schema::connection

  • 5/22/2018 Documentacion Laravel

    15/226

    Cdigo :

    Schema::connection('stark')->create('deaths', function($table)

    {

    $table->increments('id');

    $table->string('type');$table->string('name');

    });

    ConsultasSi ests usando el constructor de consultas simples usa el mtodo:Cdigo :

    DB::connection

    Cdigo :

    $users = DB::connection('lannister')->select(...);

    EloquentSi ests usando Eloquent puedes definir la conexin de base de datos en elmodelo a travs de la propiedad.

    Cdigo :

    $connection

    Cdigo :

  • 5/22/2018 Documentacion Laravel

    16/226

    Tiempo de ejecucinSi necesitas cambiar de conexin de base de datos durante la ejecucin de algunafuncin puedes hacerlo con el mtodo:Cdigo :

    setConnection

    el cual recibe como parmetro el nombre de la conexin:Cdigo :

  • 5/22/2018 Documentacion Laravel

    17/226

    4.1 - Anlisis y extensin de clasesen PHP con ReflectionMethod

    Reflection es una clase o ms bien un conjunto de clases de PHP que permitensaber todo sobre tus otras clases, mtodos, funciones, parmetros, etctera...

    Quizs es una de las funcionalidades ms c00l que PHP ha agregadorecientemente y quizs una de las que menos se conoce o seusa:ReflectionMethod.

    Por ac les dejo un cdigo que me pareci bastante prctico y su siguienteexplicacin:

    Supongamos que necesitan llamar a un mtodo de una clase (un controlador oalgo as) usando call_user_func_array desde alguna parte de nuestro script, peroantes de llamarlo directamente, quieren validar que:

    El mtodo a llamar sea pblico.

    La cantidad de parmetros enviados no es menor que la cantidad de parmetrosrequeridos por el mtodo.

    Y adicionalmente les gustara no slo pasar los parmetros como parmetrosordinarios, sino tambin tenerlos disponibles en una clase aparte, es decir, que al

    llamar a una funcin como:

    Cdigo :

    functionverLista($year, $month)

    Con los siguientes valores:

    Cdigo :

    call_user_func_array(array($controller, 'verLista'), array(2008,

    10));

    http://ve2.php.net/manual/en/language.oop5.reflection.php#language.oop5.reflection.reflectionmethodhttp://ve2.php.net/manual/en/language.oop5.reflection.php#language.oop5.reflection.reflectionmethodhttp://ve2.php.net/manual/en/language.oop5.reflection.php#language.oop5.reflection.reflectionmethodhttp://ve2.php.net/manual/en/language.oop5.reflection.php#language.oop5.reflection.reflectionmethod
  • 5/22/2018 Documentacion Laravel

    18/226

    Permita generar en el Controller un objeto con los siguientes valores:

    Cdigo :

    $this->params->year = 2008;

    $this->params->month = 10;

    Lo cual tal vez sera util si ms adelante se necesita pasar estos valores de unmtodo a otro dentro del controlador sin necesidad del uso de parmetros y si sequiere agregar una seguridad extra al script (como bloquear la posibilidad desobreescribir o reemplazar parametros)

    En fin, esta es la idea.. Aqu el cdigo:

    Primeramente tenemos una clase bsica llamada ControllerParams que permiteguardar y obtener datos / parmetros:

    Cdigo :

    classControllerParams

    {

    private$params = array();

    function__set($name, $value)

    {

    $this->params[$name] = $value;

    }

    function__get($name)

    {

    return$this->params[$name];

    }

    }

    Y aqu el mtodo que hace la funcionalidad ya descripta:

    Cdigo :

  • 5/22/2018 Documentacion Laravel

    19/226

    classController

    {

    protected$params = null;

    finalfunctionexecute($action, $params = null) //funcion

    intermedia

    {

    $reflectionMethod = newReflectionMethod($this, $action);

    //se crea una instancia de ReflectionMethod con la referencia al

    metodo que necesitamos llamar

    //asi ya tenemos disponible las funcionalidades de

    ReflectionMethod:

    if(($action == 'execute') || !$reflectionMethod-

    >isPublic() || (count($params) < $reflectionMethod-

    >getNumberOfRequiredParameters()))

    {

    //LANZAR ERROR

    }

    $parametros = $reflectionMethod->getParameters(); //con

    esto obtenemos los parametros de nuestro metodo

    $this->params= newControllerParams();

    foreach($parameters as$key => $parameter) //y hacemos un

    ciclo con ellos

    {

    $name = $parameter->getName(); //obtenemos el nombre

    if(isset($params[$key])) //si el usuario mand algun

    valor lo asignamos{

    $this->params->$name = $params[$key];

    }

    else

    {

    $this->params->$name = $parameter-

  • 5/22/2018 Documentacion Laravel

    20/226

    >getDefaultValue(); //sino tambien podemos tomar el valor por

    defecto

    }

    }

    call_user_func_array(array(&$this, $action), $params);

    //y por ultimo hacemos el llamado de costumbre

    }

    }

    Ntese que los parmetros son tambin objetos con funcionalidades ...

  • 5/22/2018 Documentacion Laravel

    21/226

    Redimensionar imgenes en PHPcon clases abstractas

    Las clases abstractas en la programacin orientada a objetos son clases de lasque no se pueden crear instancias/objetos directamente de ella.

    Para qu defino una clase como abstracta si no puedo crear objeto de

    ella?

    Si puedes crear instancias pero solo de clases que hereden dicha clase (que nosean abstractas por supuesto). El objetivo principal de la herencia es mejorar la

    clase heredada. As que sabiendo esto, las clases abstractas en su ms puraesencia son clases mejorables!

    Una clase abstracta puede tener mtodos y propiedades como cualquier otraclase.

    Cuando debo definir una clase abstracta?

    Cuando puedas crear diferentes clases que tengan propiedades y mtodos

    comunes, y an sabiendo que en el futuro que puedes crear ms clases del mismotipo.

    En la clase abstracta se definiran las propiedades y mtodos comunes, para quelas clases que la hereden no tengan la necesidad implementar esos mtodos o

    definir las propiedades.

    Mtodos Abstractos

    As como hay clases abstractas, tambin hay mtodos abstractos. Estos mtodosno son implementados en su definicin, pero obligaa las clases que hereden elmtodo a implementarlo.

    Un mtodo abstracto se puede definir en casi cualquier clase, no necesariamentedebe ser una clase abstracta. Un ejemplo en las que no se deberan definirmtodos abstractos serian en las clases finales, pues no se podran implementar.

  • 5/22/2018 Documentacion Laravel

    22/226

    Las clases finales: son las clases engredas en la POO su lema principal: Nadieme puede mejorar!. Es decir, que no se pueden heredar. Entonces se podra decirque son las opuestas a las clases abstractas que son la de baja autoestima sulema: "Soy intil sola, mejorame por favor ".

    Redimensionar imgenes en PHP usando clase abstracta

    Definimos una clase abstracta llamada ImageBase. Todas las clases que heredenesta clase tendrn:

    Las propiedades width y height, con sus respectivos setters y getters.Adems de dos metodos comunes los cuales son: gdFromFile y gdToFile.Obliga a la clase que le herede a implementar el metodo save

    Cdigo :

    abstractclassImageBase

    {

    protected$width;

    protected$height;

    publicfunctionsetWidth($w)

    {

    // gd solo maneja enteros, ergo obligamos que ancho seaentero.

    $w = (int) $w;

    // ancho debe ser mayor que 0

    if($w > 0) $this->width = $w;

    }

    publicfunctiongetWidth()

    {

    return$this->width;

    }

    publicfunctionsetHeight($h)

    {

    // gd solo maneja enteros, ergo obligamos que alto sea

    entero

    $h = (int) $h;

    // alto debe ser mayor que 0

  • 5/22/2018 Documentacion Laravel

    23/226

    if($h > 0) $this->height = $h;

    }

    publicfunctiongetHeight()

    {

    return$this->height;}

    /**

    * Genera una imagen gd del archivo con nombre $filename

    * Retorna FALSE si ocurrior algun error, por ejemplo: el

    tipo no es soportado

    *

    * @param string $filename nombre del archivo

    * @param int $type Tipo de imagen para saber que funcion

    usar* @return resource Una imagen gd.

    */

    protectedfunctiongdFromFile($filename, $type)

    {

    $gd = false;

    switch($type)

    {

    caseIMAGETYPE_PNG:

    $gd = imagecreatefrompng($filename);

    break;caseIMAGETYPE_JPEG:

    $gd = imagecreatefromjpeg($filename);

    break;

    caseIMAGETYPE_GIF:

    $gd = imagecreatefromgif($filename);

    break;

    }

    return$gd;

    }

    /**

    * Guarda una imagen gd en el archivo de nombre $filename

    *

    * @param resource $gd La imagen a guardar

    * @param string $filename nombre del archivo

    * @param int $type Tipo de imagen para saber que funcion

    usar

  • 5/22/2018 Documentacion Laravel

    24/226

    * @return bool TRUE en caso de exito, FALSE en caso

    contrario

    *

    */

    protectedfunctiongdToFile($gd, $filename, $type)

    {$success = false;

    // si $filename es nulo las funciones posteriores

    imprimiran en la salida directamente

    // aqui tratamos de evitar eso

    $filename = (string) $filename;

    if(trim($filename) != "")

    {

    // no tiene sentido verificar si el archivo existe,

    pues si no existe se creara

    // las siguientes funciones retornan false siocurrio algun error, true en caso de exito

    switch($type)

    {

    caseIMAGETYPE_PNG:

    $success = imagepng($gd, $filename);

    break;

    caseIMAGETYPE_GIF:

    $success = imagegif($gd, $filename);

    break;

    caseIMAGETYPE_JPEG:$success = imagejpeg($gd, $filename);

    break;

    }

    }

    return$success;

    }

    // Obligamos a que las clases que hereden esta clase

    implementen este mtodo

    /**

    * La intencion de este metodo es que guarde la imagen

    creada en un archivo

    *

    * @param string $filename Nombre del archivo

    * @return bool TRUE en caso de exito, FALSE en caso

    contrario

    */

  • 5/22/2018 Documentacion Laravel

    25/226

    abstractpublicfunctionsave($filename);

    }

    Creamos ImageResize que hereda ImageBase.Cdigo :

    classImageResizeextendsImageBase

    {

    private$src;

    private$origWidth;

    private$origHeight;

    private$origType;

    private$hasError = false;

    publicfunction__construct($src)

    {

    $this->setSrc($src);

    }

    privatefunctionsetSrc($src)

    {

    if(is_file($src))

    {

    // getimagesize retorna un arreglo si tuvo exito con la

    informacion de la imagen

    // false en caso contrario

    $info = getimagesize($src);

    if($info !== FALSE)

    {

    $this->src = $src;

    $this->origWidth = $info[0]; // ancho de la imagen

    $this->origHeight = $info[1]; // alto de la imagen

    $this->origType = $info[2]; // constante de php que

    tiene el tipo de imagen, un entero

    // por defecto usaremos las dimensiones de la imagen

    original

    $this->resize($this->origHeight, $this->origHeight);

    }

    else

  • 5/22/2018 Documentacion Laravel

    26/226

    {

    $this->throwError("$src is not an image file",

    E_USER_ERROR);

    }

    }

    else{

    $this->throwError("$src is not file valid",

    E_USER_ERROR);

    }

    }

    /**

    * Asigna los valores a los que se redimensionara la imagen

    *

    * @param int $w ancho* @param int $h alto

    */

    publicfunctionresize($w, $h)

    {

    if($w < 1) $this->throwError("Ancho debe ser mayor que

    0", E_USER_NOTICE);

    if($h < 1) $this->throwError("Alto debe ser mayor que

    0", E_USER_NOTICE);

    $this->setWidth($w);$this->setHeight($h);

    }

    /**

    * Redimensiona la imagen con el ancho y alto asignado en

    resize

    * y la guarda en el archivo de nombre $filename

    *

    * @param string $filename nombre del archivo

    * @return bool TRUE en caso de exito, FALSE si algo salio

    mal

    */

    publicfunctionsave($filename)

    {

    $success= false;

    // obtenemos la imagen en gd del archivo

  • 5/22/2018 Documentacion Laravel

    27/226

    $orig = $this->gdFromFile($this->src, $this->origType);

    if($gd !== FALSE) // si lo obtuvimos

    {

    // creamos una imagen vacia con ancho y alto, servira

    de contenedor

    $base = imagecreatetruecolor($this->width, $this->height);

    // aqui redimensionamos la imagen

    // la imagen redimensionada queda en $base, esta

    funcion retorna TRUE si tuvo exito, FALSE en caso contrario

    $resized = imagecopyresampled($base, $orig, 0, 0, 0,

    0, $this->width, $this->height, $this->origWidth, $this-

    >origHeight);

    if($resized) // pudimos redimensionar

    {// guardamos gd en el archivo $filename

    if(!$this->gdToFile($base, $filename, $this-

    >origType))

    {

    $this->throwError("Archivo no generado",

    E_USER_WARNING);

    }

    else

    {

    // todo salio bien$success = true;

    // liberamos los recursos gd

    imagedestroy($base);

    imagedestroy($orig);

    }

    }

    }

    else

    {

    $this->throwError("Gd no fue generado.",

    E_USER_WARNING);

    }

    return$success;

    }

    privatefunctionthrowError($msg, $level)

    {

  • 5/22/2018 Documentacion Laravel

    28/226

    trigger_error($msg, $level);

    }

    }

    ?>

    Uso de ImageResize

    Cdigo :

  • 5/22/2018 Documentacion Laravel

    29/226

    Qu otra clase pudiera heredar ImageBase?

    Que tantas clases puede crear con la libreria gd de php?Captcha: una clase que genere captcha.Grficos: una clase que generegrficos.Thumbs: si no te gusta ImageResize, mejorala o crea tu propia clase.

    Se te ocurre una otra? Comenta aqu.

    Nota: la implementacin de ambas clases se pueden mejorar. La nica intencin

    de estas implementaciones es mostrar un ejemplo real de como se deben usar y lo

    til que son las clases abstractas.

  • 5/22/2018 Documentacion Laravel

    30/226

    1.3 - Porqu elegir Laravel en vez deCodeigniter

    Empezar aprogramar con PHPnunca ha sido sencillo.El sitio oficialtiene una

    documentacin muy completa de todas las funcionalidades del lenguaje, sin

    embargo, no es un buen punto de partida para aprender a hacer algo

    funcional, por ejemploun mdulo con PHP.

    Empezando mi carrera autodidacta para ser desarrollador web, recuerdo

    que imprim TODA la documentacin de PHP y la le completa durante unas

    vacaciones.

    Hice lo mismo con la documentacin de MySQL. Al final no saba hacer

    NADA.

    http://www.cristalab.com/tags/php/http://www.cristalab.com/tags/php/http://www.cristalab.com/tags/php/http://php.net/http://php.net/http://php.net/http://www.cristalab.com/tutoriales/crear-un-modulo-de-usuarios-con-laravel-c111632l/http://www.cristalab.com/tutoriales/crear-un-modulo-de-usuarios-con-laravel-c111632l/http://www.cristalab.com/tutoriales/crear-un-modulo-de-usuarios-con-laravel-c111632l/http://www.cristalab.com/tutoriales/crear-un-modulo-de-usuarios-con-laravel-c111632l/http://php.net/http://www.cristalab.com/tags/php/
  • 5/22/2018 Documentacion Laravel

    31/226

    S me sirvi de referencia aprender qu hacan las funciones del lenguaje,

    aunque hoy en da sigo consultando el sitio a menudo.

    Entonces comenc a buscar tutoriales ms prcticos de PHP. Por

    ejemplolas memorias de un aprendiz.Alguien lo recuerda?

    Pero hoy en da si quieres trabajar con PHP adems tienes que:

    Elegir el Framework adecuado

    Esto quiere decir que tenga:

    Un desarrollo activo: te garantiza correccin de problemas de seguridad,

    mejoras, etc.

    Una comunidad activa: la vas a necesitar cuando no sepas cmo hacer

    algo.

    Buena documentacin: puede ser el mejor framework del mundo pero si

    nadie sabe cmo usarlo no sirve de nada.

    Pero la mayora de los frameworks ya tienen

    eso:Symfony,Codeigniter,Laravel,entre otros, entonces:

    Cul framework elegir?

    Hace unos aos atrs era una respuesta difcil, mi decisin estaba entre

    Symfony y Codeigniter, a m me gustaba ms Symfony pero mi equipo de

    trabajo prefera el segundo.

    http://www.rinconastur.com/php/http://www.rinconastur.com/php/http://www.rinconastur.com/php/http://symfony.com/http://symfony.com/http://symfony.com/http://ellislab.com/codeigniterhttp://ellislab.com/codeigniterhttp://ellislab.com/codeigniterhttp://laravel.com/http://laravel.com/http://laravel.com/http://laravel.com/http://ellislab.com/codeigniterhttp://symfony.com/http://www.rinconastur.com/php/
  • 5/22/2018 Documentacion Laravel

    32/226

    Symfony era y sigue siendo complejo, muy difcil de aprender, por otro lado,

    CodeIgniter muy fcil de aprender porque es muy simple, carece de muchas

    utilidades necesarias en un verdadero framework.

    En Symfony 1.4 gastaba el 80% del tiempo investigando cmo hacer algo y

    corrigiendo bugs y el 20% ejecutando, mientras que en CodeIgniter solo

    20% investigando pero 80% ejecutando.

    De vuelta al 2013

    Hoy en da Symfony 2 es el framework para PHP ms robusto que

    existe,Fabien Potencier,su creador, es una mquina escribiendo cdigo. Es

    increble tener en PHP componentes como elDOM crawler(disponible tambin

    en Laravel)que te permite recorrer y revisar desde PHP el cdigo HTML

    como lo haras conFirebugy eso se lo debemos a Fabien.

    Sin embargo, Symfony parece no estar escrito para seres humanos.

    Sloalgunos pocos privilegiadosson capaces de aprovechar todo su potencial.

    Lo que hace que muchos se hayan ido a CodeIginter,pero

    Porqu elegir Laravel en vez CodeIgniter

    CodeIgniter no ofrece nada ms all de sencillez, despus de leerte su

    documentacin en un da y tener que enfrentarte a las necesidades de un

    proyecto real quedas en frente de unacarpeta de modelos vacapreguntndote

    Y ahora qu? Es all donde:

    http://fabien.potencier.org/http://fabien.potencier.org/http://fabien.potencier.org/http://symfony.com/doc/current/components/dom_crawler.htmlhttp://symfony.com/doc/current/components/dom_crawler.htmlhttp://symfony.com/doc/current/components/dom_crawler.htmlhttp://www.cristalab.com/tags/laravel/http://www.cristalab.com/tags/laravel/http://www.cristalab.com/tags/laravel/http://www.cristalab.com/tags/laravel/http://getfirebug.com/http://getfirebug.com/http://knplabs.com/open-sourcehttp://knplabs.com/open-sourcehttp://knplabs.com/open-sourcehttp://ellislab.com/codeigniter/user-guide/general/models.htmlhttp://ellislab.com/codeigniter/user-guide/general/models.htmlhttp://ellislab.com/codeigniter/user-guide/general/models.htmlhttp://ellislab.com/codeigniter/user-guide/general/models.htmlhttp://knplabs.com/open-sourcehttp://getfirebug.com/http://www.cristalab.com/tags/laravel/http://www.cristalab.com/tags/laravel/http://symfony.com/doc/current/components/dom_crawler.htmlhttp://fabien.potencier.org/
  • 5/22/2018 Documentacion Laravel

    33/226

    Si eres experto, instalas plugins o construyes un sub-framework encima de

    CodeIgniter para suplir sus carencias.

    Si eres principiante empiezas a lanzar un montn de lneas de cdigo en un

    controlador.

    Codeigniter miente y no tieneORM propio

    Slo tiene un constructor de queries que ellos dicen que es una versin

    modificada delpatrn de diseoActive Recordpero eso es falso.

    El patrn Active Record permite trabajar tus tablas como si fueran clases y

    tus filas comoobjetos,con Laravel puedes (as como con Ruby on Rails):

    Cdigo :

    $user = newUser;

    $user->name = Duilio;

    $user->save(); // This is awesome

    En Codeigniter sera esto:

    Cdigo :

    $this->db->insert(users,array(name=> Duilio);// No active record

    at all

    http://es.wikipedia.org/wiki/Mapeo_objeto-relacionalhttp://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1ohttp://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1ohttp://en.wikipedia.org/wiki/Active_record_patternhttp://en.wikipedia.org/wiki/Active_record_patternhttp://en.wikipedia.org/wiki/Active_record_patternhttp://www.cristalab.com/programacion-orientada-objetos/http://www.cristalab.com/programacion-orientada-objetos/http://www.cristalab.com/programacion-orientada-objetos/http://www.cristalab.com/programacion-orientada-objetos/http://en.wikipedia.org/wiki/Active_record_patternhttp://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1ohttp://es.wikipedia.org/wiki/Mapeo_objeto-relacional
  • 5/22/2018 Documentacion Laravel

    34/226

    PHP 5 en adelante est orientado a poner a disposicin de sus

    programadores el potencial de la programacin orientada a objetos. Si bien

    el enfoque de la base de datos de Codeigniter fue funcional en un tiempo,ya

    qued en el pasado.

    Laravel en constraste tiene un ORM llamado Eloquent y adems tiene un

    constructor de queries llamado Fluent, ambos superan al Active recorddel

    otro framework.

    No incentiva al uso de plantillas en las vistas

    En Codeiginiter:

    Cdigo :

    Contrastado con Laravel:

    Cdigo :

    http://philsturgeon.co.uk/blog/2012/05/laravel-is-awesomehttp://philsturgeon.co.uk/blog/2012/05/laravel-is-awesomehttp://philsturgeon.co.uk/blog/2012/05/laravel-is-awesomehttp://philsturgeon.co.uk/blog/2012/05/laravel-is-awesomehttp://philsturgeon.co.uk/blog/2012/05/laravel-is-awesomehttp://philsturgeon.co.uk/blog/2012/05/laravel-is-awesome
  • 5/22/2018 Documentacion Laravel

    35/226

    @foreach ($addressbook as $name)

    {{ $name }}

    @endforeach

    La documentacin de CodeIgniter miente de nuevo al decir que los pseudo-

    lenguajes de plantillas, comoel sistema de plantillas Blade de Laravel,son ms

    lentos en ejecutarse. Esto no es cierto porque todos al final se compilan a

    cdigo PHP, y lo que se leer una y otra vez ser PHP y no pseudo-

    lenguaje.

    CodeIgniter ofrece unparser de plantillas muy simple,pero ste pierde el

    concepto de un VERDADERO lenguaje de plantillas: convertir etiquetas de

    a {{ name }} es slo la punta del iceberg.

    Un verdadero lenguaje de plantillas debe tener herencia de plantillas

    (layouts)y muchas otras caractersticas queSmarty,Twigposeen,

    allBladede Laravel no se queda muy atrs.

    http://www.cristalab.com/tutoriales/blade-el-sistema-de-plantillas-de-laravel-c111587l/http://www.cristalab.com/tutoriales/blade-el-sistema-de-plantillas-de-laravel-c111587l/http://www.cristalab.com/tutoriales/blade-el-sistema-de-plantillas-de-laravel-c111587l/http://ellislab.com/codeigniter/user-guide/libraries/parser.htmlhttp://ellislab.com/codeigniter/user-guide/libraries/parser.htmlhttp://ellislab.com/codeigniter/user-guide/libraries/parser.htmlhttp://smarty.com/http://smarty.com/http://smarty.com/http://twig.sensiolabs.org/http://twig.sensiolabs.org/http://twig.sensiolabs.org/http://laravel.com/docs/templateshttp://laravel.com/docs/templateshttp://laravel.com/docs/templateshttp://laravel.com/docs/templateshttp://twig.sensiolabs.org/http://smarty.com/http://ellislab.com/codeigniter/user-guide/libraries/parser.htmlhttp://www.cristalab.com/tutoriales/blade-el-sistema-de-plantillas-de-laravel-c111587l/
  • 5/22/2018 Documentacion Laravel

    36/226

    Super Controlador al rescate...

    Como Codeigniter es tan bsico, muchos programadores terminan

    escribiendo la mayor parte de la lgica de sus aplicaciones en un solo lugar:

    el controlador.

    Por ejemplo laclase de rutases tan simple, que se queda corta en los

    proyectos de la vida real y no queda ms que lidiar con los segmentos de

    las URL desde el controlador, donde ya tu aplicacin debera saber qu

    hacer.

    Incluso en el mismo ncleo de Codeigniter, el controlador es una especie de

    super clase que est a cargo de casi todo, como lo demuestra esta imagen:

    Al tratar de solucionar todos los problemas en una sola capa estarsescribiendo un cdigo difcil de leer y mantener y no estars aprovechando

    lasfuncionalidades que un framework en el ao 2013 debe tener para ti.

    Laraveltiene rutas, modelos, eventos, filtros, etc.que permiten que tus

    http://ellislab.com/codeigniter/user-guide/general/routing.htmlhttp://ellislab.com/codeigniter/user-guide/general/routing.htmlhttp://ellislab.com/codeigniter/user-guide/general/routing.htmlhttp://www.cristalab.com/blog/2013-el-ano-de-javascript-c109307l/http://www.cristalab.com/blog/2013-el-ano-de-javascript-c109307l/http://www.cristalab.com/blog/2013-el-ano-de-javascript-c109307l/http://laravel.com/docs/routinghttp://laravel.com/docs/routinghttp://laravel.com/docs/routinghttp://laravel.com/docs/routinghttp://www.cristalab.com/blog/2013-el-ano-de-javascript-c109307l/http://ellislab.com/codeigniter/user-guide/general/routing.html
  • 5/22/2018 Documentacion Laravel

    37/226

    controladores puedan verse as:

    Cdigo :

    publicfunctionedit($user)

    {

    returnView::make('admin.users.form')->with('form', $form);

    }

    Puedes configurar una URL users/{id} para que Laravel consulte la BD porti, te traiga el usuario correspondiente a la ID o lance un 404 si no es

    encontrado, todo eso antes de llegar al controlador.

    En contraste con lo que sera Codeigniter:

    Cdigo :

    publicfunctionedit($id)

    {

    $user = $this->db->select('users', array('id'=> $id));

    if(is_null ($user)) $this->error404();

    //etc...

    }

  • 5/22/2018 Documentacion Laravel

    38/226

    Revisen la documentacin deCodeignitervs la deLaravelen el tema de rutas

    y comparen la diferencia.

    Laravel es FCILHace aos justificaba que la gente trabajara con Codeigniter, Symfony esmuy complejo y otras alternativas como CakePHP son inciertas.

    Hoy en da en el mundo de PHP tenemos un framework que est bienhecho, combina las mejoresprcticas de desarrolloy hace que nosotros,programadores de PHP podamos escribir un cdigo del cual sentirnosorgullosos.

    En tu primer proyecto con Laravel usars el 40% del tiempo paradocumentarte, otro 40% para desarrollarlo y un 20% para contemplarcun genial qued tu cdigo.

    Saludos!

    http://ellislab.com/codeigniter/user-guide/general/routing.htmlhttp://ellislab.com/codeigniter/user-guide/general/routing.htmlhttp://ellislab.com/codeigniter/user-guide/general/routing.htmlhttp://laravel.com/docs/routinghttp://laravel.com/docs/routinghttp://laravel.com/docs/routinghttp://www.cristalab.com/blog/10-errores-comunes-programando-orientado-a-objetos-en-php-c41916l/http://www.cristalab.com/blog/10-errores-comunes-programando-orientado-a-objetos-en-php-c41916l/http://www.cristalab.com/blog/10-errores-comunes-programando-orientado-a-objetos-en-php-c41916l/http://www.cristalab.com/blog/10-errores-comunes-programando-orientado-a-objetos-en-php-c41916l/http://laravel.com/docs/routinghttp://ellislab.com/codeigniter/user-guide/general/routing.html
  • 5/22/2018 Documentacion Laravel

    39/226

    2 - Introduccin a Laravel

    Laravel es uno de los frameworks ms fciles de aprender paraPHP, yo dira que tan fcil como Codeigniter. Sin embargo enLaravel, fcil no quiere decir simple. Este potente frameworkcombina los features ms modernos de PHP para brindarnos unainterfaz elegante y hasta divertida de usar:

    Quieren una ruta?Cdigo :

    // En app/routes.php:

    Route::get(welcome, function() {

    return Bienvenidos a Laravel;

    });

    Ahora quieren usar vistas con HTML?

    Cdigo :

    Bienvenidos a Laravel

    Quieren que la vista tenga un header y un footer? Laravel usa un

    concepto ms potente llamado Layout. Cambiamos nuestra plantillawelcome.blade.php a:Cdigo :

  • 5/22/2018 Documentacion Laravel

    40/226

    @extends(layout)

    @section(content)

    Bienvenidos a Laravel

    @stop

    Y ahora creamos nuestro Layout

    Cdigo :

    Hacer vistas en Laravel es muy sencillo

    @yield(content)

    Cuando usemos nuestra vista "welcome", Laravel cargarautomticamente la vista layout por nosotros, y reemplazar en la

  • 5/22/2018 Documentacion Laravel

    41/226

    plantilla layout la lnea @yield('content') por todo el HTML quehayamos escrito en la plantilla welcome entre @section('content') ystop, quedando el resultado as:Cdigo :

    Hacer vistas en Laravel es muy sencillo

    Bienvenidos a Laravel

    De esta forma tendremos 1 solo layout que usaremos en todas

    nuestras vistas, evitando repetir el cdigo.

    Ahora usar nuestras vistas es tan fcil como esto:Cdigo :

    Route::get(welcome, function() {

    return View::make(welcome);

    });

    Y as en adelante Quieren hacer una redireccin?Cdigo :

  • 5/22/2018 Documentacion Laravel

    42/226

    returnRedirect::to(goodbye)

    Generar una URL?Cdigo :

    URL::to(welcome)

    Que tal si quisiramos pasar parmetros dinmicos a nuestravista? Tan fcil como esto:Cdigo :

    View::make(welcome)->with(name,Duilio);

    Nuestra vista welcome.blade.php quedara de la siguiente manera:Cdigo :

    Bienvenido, {{ name }}

    O as (si prefieren usar PHP directamente):Cdigo :

    Bienvenido,

  • 5/22/2018 Documentacion Laravel

    43/226

    Caractersticas de la versin 4 de Laravel

    Lo ms interesante de la versin 4 de Laravel es que detrs de toda

    esta interfaz tan fcil de usar se esconde una arquitectura bastanteslida (SOLID).

    Por ejemplo, los mtodos estticos que vimos hace poco no sonms que una fachada (Facade). Por debajo se hace el llamado alcontenedor de Laravel, el cual maneja todas las dependencias entrelas clases del framework y de nuestra aplicacin.

    Tanto si entendiste o no el ltimo prrafo, tanto si eres un entusiastaque busca hacer sitios web de forma rpida y simple, o eres unexperto que busca crear una robusta aplicacin, fcil de mantener yprobar: Laravel es el framework para ti.

    La idea de este set de tutoriales es ensearlos a usar Laravel desdelo ms bsico (rutas, vistas, formularios, bases de datos) hasta loms avanzado (inyeccin de dependencias, pruebas unitarias).

    http://elblogdelfrasco.blogspot.com/2012/03/solid-los-5-principios-fundamentales-de.htmlhttp://elblogdelfrasco.blogspot.com/2012/03/solid-los-5-principios-fundamentales-de.htmlhttp://elblogdelfrasco.blogspot.com/2012/03/solid-los-5-principios-fundamentales-de.htmlhttp://goo.gl/xJbJ2yhttp://goo.gl/xJbJ2yhttp://elblogdelfrasco.blogspot.com/2012/03/solid-los-5-principios-fundamentales-de.html
  • 5/22/2018 Documentacion Laravel

    44/226

    2.1 - Cmo instalar Laravel yComposer

    En el captulo anterior de Introduccin a Laravel les mostr un pocosobre la fcil sintxis de Laravel. Tambin les mencion brevementeque detrs de esta interfaz que nos permite casi hablarle alframework: redireccioname a, haz una vista con este

    parmetro/valor, debajo de todo eso se esconde unaarquitectura SLIDAde desarrollo, haciendo a Laravel unframework de PHP ideal tanto para principiantes como paraexpertos.

    Mi intencin era despertar la curiosidad en la herramienta, si estsac, quizs tuve xito. Ahora es momento de vercmo instalarLaravely Composer.

    Requisitos para Instalar Laravel

    Laravel es un framework para PHP, obviamente tiene comorequisito tener instalado... PHP, en este caso, la versin de PHP5.3.2. Adems necesitaremos laextensin MCrypt de PHP.Tambin necesitan un servidor web como Apachey una base dedatos como MySQL. Hay cientos de artculos sobre cmoconseguir todo esto, tambin hay herramientas comoXAMPP queinstalan todo esto por t.

    http://www.cristalab.com/tags/laravel/http://www.cristalab.com/tags/laravel/http://www.cristalab.com/tags/laravel/http://www.cristalab.com/tags/laravel/http://es.wikipedia.org/wiki/XAMPPhttp://es.wikipedia.org/wiki/XAMPPhttp://es.wikipedia.org/wiki/XAMPPhttp://www.cristalab.com/tags/laravel/http://www.cristalab.com/tags/laravel/
  • 5/22/2018 Documentacion Laravel

    45/226

    Ms adelante necesitarn el mdulo Rewrite (mod_rewrite) deApache. Si han trabajado antes con otros frameworks sabrn dequ les hablo, sino, por ahora les comento que es un mdulo que

    hace posibleURLs amigablescomo las de Cristalab:Cdigo :

    cristalab.com/tutoriales/introduccion-a-laravel-c111339l/

    En vez de:Cdigo :

    cristalab.com/tutoriales.php?id=c111339I.

    Estas son tiles para los motores de bsqueda y tambin para losusuarios. En otro tutorial hablaremos de esto.

    Tambin necesitarn un conocimiento bsico de PHP, es un

    http://www.cristalab.com/tutoriales/crear-urls-amigables-en-php-con-symfony2-y-el-componente-routing-c104486l/http://www.cristalab.com/tutoriales/crear-urls-amigables-en-php-con-symfony2-y-el-componente-routing-c104486l/http://www.cristalab.com/tutoriales/crear-urls-amigables-en-php-con-symfony2-y-el-componente-routing-c104486l/http://www.cristalab.com/tutoriales/crear-urls-amigables-en-php-con-symfony2-y-el-componente-routing-c104486l/
  • 5/22/2018 Documentacion Laravel

    46/226

    plus si saben de programacin orientada a objetos o si ya han

    usado otros frameworks. Igual tratar de explicar tododetalladamente y adems tenemos la seccin de comentarios dondepueden hacer preguntas, con suerte adems de m, otros usuarios

    tambin quieran ayudar a aclarar dudas.

    Cmo instalar Laravel y Composer

    Si tienen experiencia con PHP sabrn que ste es un lenguajeinterpretado, bsicamente una library para PHP (un framework por

    ej.) no es ms que una serie de archivos .php dentro de carpetasdentro de sub-carpetas, y para instalarlo por lo general no hace faltams que descargar archivos de un repositorio GIT o de una pgina,descomprimirlos en algn lado y listo.

    Para instalar Laravel 4, hace falta un paso extra.Pero no nospreocupemos, en realidad es una ventaja que nos pondr no slo aLaravel sino a miles de paquetes a nuestra disposicin, me refiero a

    Composer.

    Composer

    Composeres un excelente manejador de paquetes ydependencias entre paquetes para PHP.

    http://getcomposer.org/http://getcomposer.org/http://getcomposer.org/
  • 5/22/2018 Documentacion Laravel

    47/226

    Qu son dependencias y paquetes?

    Imagina que tienes un pequeo proyecto como ir de viaje de unaciudad a otra y para hacerlo necesitas un medio de transporte, en

    este caso, digamos, un automvil.

    Si fueras un programa de software el automvil sera un paquete, ytu viaje sera la aplicacin que "depende" de l.

    Entonces, en este caso, Composer viene siendo como el personajeTank de la pelcula Matrix, t le dices Composer, necesito un au topara mi viaje y Composer se encarga de buscar el paqueteautoe

    instalarlo para ti. Luego auto le dir a Composer que necesitatambin un paquete motor, otro paquete sistema de frenos, y assucesivamente. Composer ir buscando e instalando cadapaquete y las dependencias de cada subpaquete,recursivamente, hasta armar el auto, todo lo cual ser transparentepara ti.

  • 5/22/2018 Documentacion Laravel

    48/226

    Cmo instalar Composer

    Aqu tienen lasinstrucciones de la pgina oficial,bsicamente haydos formas:

    Instalar Composer en Linux:

    Ejecuten desde su consola el siguiente comando:Cdigo :

    curl -sS https://getcomposer.org/installer | php

    O si no tienen CURL instalado:Cdigo :

    php -r

    "eval('?>'.file_get_contents('https://getcomposer.org/installer'

    ));"

    Si todo sale bien ya podrn usar Composer con el siguiente

    comando:Cdigo :

    php composer.phar

    http://getcomposer.org/download/http://getcomposer.org/download/http://getcomposer.org/download/http://getcomposer.org/download/
  • 5/22/2018 Documentacion Laravel

    49/226

    Instalar Composer globalmente.Es mejor instalar y tener disponible Composer en todo todo el

    sistema, para ello hay que renombrar el archivo a composer (sinextensin) y moverlo a /usr/local/bin.

    Si no tienes el directorio /usr/local/bin puedes ejecutar echo $PATHen la consola para obtener las carpetas adecuadas.

    Instalar Composer en Windows:

    Descarga el instalador desde aquodesde la pgina oficial(paradesconfiados), ejectalo y presiona: siguiente, siguiente, finalizar.

    http://getcomposer.org/Composer-Setup.exehttp://getcomposer.org/Composer-Setup.exehttp://getcomposer.org/download/http://getcomposer.org/download/http://getcomposer.org/download/http://getcomposer.org/download/http://getcomposer.org/Composer-Setup.exe
  • 5/22/2018 Documentacion Laravel

    50/226

    Tambin les har faltauna consola de GIT,yo usosta.Mismoproceso: descarguen, ejecuten, siguiente, siguiente, finalizar.

    Instalar Laravel

    Una vez instalado composer, usando la consola/terminal (si estamosen Windows usaremos la consola de GIT que recien instalamos),

    vamos a nuestra carpeta de proyectos, por ejemplo: cd /var/www o/home/usuario/proyectos_web/ o /c/xampp/httpdocs/ y all tipeamos:

    Cdigo :

    composer create-project laravel/laravel pruebalaravel

    http://git-scm.com/downloadshttp://git-scm.com/downloadshttp://git-scm.com/downloadshttp://git-scm.com/downloadshttp://git-scm.com/downloadshttp://git-scm.com/downloadshttp://git-scm.com/downloadshttp://git-scm.com/downloads
  • 5/22/2018 Documentacion Laravel

    51/226

    Para usuarios d e Linux que no instalaron Compos er globalmente:

    (El comando sera php composer.phar y necesitaran obviamentetener el archivo composer.phar en la misma carpeta desde dondeejecutan el comando)

    Tiempo de ir por un caf.

    Mientras nos tomamos un descanso, Composer se encargar dedescargar el proyecto base de Laravel, el framework y todas susdependencias.

    Si son curiosos vern cmo la consola va descargando decenas depaquetes que sern usados por Laravel ms adelante.

  • 5/22/2018 Documentacion Laravel

    52/226

    Algunos de estos paquetes pertenecen al framework Symfony.

    Sym fony?

    S, antes cuando elegamos un framework como Codeigniter,Symfony o Cake, elegamos una herramienta y descartbamos lasotras. Si nos gustaba lo fcil que era Codeigniter pero tambin nos

    gustaba el ORM de symfony 1.4 tenamos que decidirnos por uno opor otro, o elegir Codeigniter y buscar en foro tras foro cmo integrarel ORM usado por symfony nativamente (Doctrine 1.2 en este caso)en Codeigniter, cruzar los dedos y esperar que todo saliera bien.

    O supongamos que queramos crear un nuevo CMS para PHP, pero

  • 5/22/2018 Documentacion Laravel

    53/226

    an as estbamos totalmente satisfechos con la forma encmosymfony maneja las rutas.No haba forma fcil de usar slo lasrutas de symfony, porque era un framework "acoplado" y tenamosque elegir usar todo o nada.

    Con la salida de proyectos como Symfony 2 y Composer, estocambi radicalmente. De hecho la versin Symfony 2 fueliberadacomo un conjunto de componentesque pueden ser usadospor separado, de manera que proyectos comoDrupal 8 integranciertos componentes de Symfony,y as lo haceLaravel.

    http://www.cristalab.com/tutoriales/crear-urls-amigables-en-php-con-symfony2-y-el-componente-routing-c104486l/http://www.cristalab.com/tutoriales/crear-urls-amigables-en-php-con-symfony2-y-el-componente-routing-c104486l/http://www.cristalab.com/tutoriales/crear-urls-amigables-en-php-con-symfony2-y-el-componente-routing-c104486l/http://www.cristalab.com/tutoriales/crear-urls-amigables-en-php-con-symfony2-y-el-componente-routing-c104486l/http://symfony.com/componentshttp://symfony.com/componentshttp://symfony.com/componentshttp://2012.drupalcamp.es/es/sesiones/symfony-en-drupal-8-los-detalles-101http://2012.drupalcamp.es/es/sesiones/symfony-en-drupal-8-los-detalles-101http://2012.drupalcamp.es/es/sesiones/symfony-en-drupal-8-los-detalles-101http://2012.drupalcamp.es/es/sesiones/symfony-en-drupal-8-los-detalles-101http://laravel.com/http://laravel.com/http://laravel.com/http://laravel.com/http://2012.drupalcamp.es/es/sesiones/symfony-en-drupal-8-los-detalles-101http://2012.drupalcamp.es/es/sesiones/symfony-en-drupal-8-los-detalles-101http://symfony.com/componentshttp://www.cristalab.com/tutoriales/crear-urls-amigables-en-php-con-symfony2-y-el-componente-routing-c104486l/http://www.cristalab.com/tutoriales/crear-urls-amigables-en-php-con-symfony2-y-el-componente-routing-c104486l/
  • 5/22/2018 Documentacion Laravel

    54/226

    Todo lo cual lleva el desarrollo de PHP a otro nivel, dondenosotros, los programadores podemos aprovechar el trabajo deotros y fcilmente poner parte de nuestro trabajo al alcance deotros, en vez de seguir reinventando la rueda una y otra vez.

  • 5/22/2018 Documentacion Laravel

    55/226

    Pero vo lviend o a la instalacin de Laravel.. .

    Una vez que se complete la descarga de los paquetes, verificamos

    nuestro directorio, el cual debe lucir similar a ste:

    ..con todas las carpetas instaladas por Composer.

    Y, como personas impacientes que somos, tambin iremoscorriendo al navegador, y tipearemos, en mi caso:Cdigo :

    http://localhost/laravelpruebas/public

  • 5/22/2018 Documentacion Laravel

    56/226

    Directorio pblico:

    (Es importante acceder a la carpeta /public que es la puerta denuestro proyecto para la web, ms adelante veremos esto endetalle)

    Y si todo ha salido bien:

    Si leste you have arrived en tu navegador, ests listo para la

    tercera parte, sino tienes varios das, los comentarios de abajo yGoogle para investigar qu sali mal y prepararte para la siguienteentrega, donde explicar lo que contienen las carpetas y archivosinstalados por Composer, entre otros temas.

    Stay tuned

  • 5/22/2018 Documentacion Laravel

    57/226

    2.2 - Configurar Base de Datos ycrear tablas con Laravel

    En los tutoriales anteriores, vimos una introducin al frameworkLaravely aprendimos cmo instalar Laravel y Composer. Deahora en adelante comenzaremos un tutorial terico - prctico deLaravel.

    Crear un mdulo de Usuarios con Laravel

    Si bien no es el mdulo ms emocionante del mundo, lo consideroprctico dado que hace falta en la mayora de las aplicaciones. Paracomenzar, necesitamos configurar nuestra base de datos y crear latabla de usuarios.

    Cmo configurar la base de datos en Laravel

    Lo haremos en cuatro sencillos pasos:

    1 - Abrimos el archivo database.php localizado en:Cdigo :

    app/config/database.php

    2 - En la lnea 29, encontraremos lo siguiente:Cdigo :

  • 5/22/2018 Documentacion Laravel

    58/226

    'default'=> 'mysql'

    Si estamos trabajando con MySQL, como es mi caso, dejaremos lalnea intacta, sino editaremos el valor entre comillas a sqlite, pgsql,etc. segn sea el caso.Entre las bases de datos soportadas por defecto en Laravelencontramos: MySQL, SQL Lite, PostgreSQL y SQL Server.

    3 - Usamos PHPMyAdmin o cualquier otra herramienta de nuestrapreferencia para crear la base de datos, en mi caso,

    con PHPMyAdmin y MySQL crear una DB llamadapruebalaravel:Cdigo :

    CREATE DATABASE `pruebalaravel`;

    4 - Una vez creada la DB debemos indicarle a Laravel el nombre denuestra base de datos y un usuario con acceso a ella, para MySQLtenemos en el mismo archivo database.php lo siguiente (lnea 55):Cdigo :

    'mysql' => array(

    'driver' => 'mysql',

    'host' => 'localhost',

    'database' => 'pruebalaravel',

    'username' => 'root',

    'password' => 'CLAVE_ULTRA_SECRETA',

  • 5/22/2018 Documentacion Laravel

    59/226

    'charset' => 'utf8',

    'collation' => 'utf8_unicode_ci',

    'prefix' => '',

    ),

    All cambiamos database por el nombre de nuestra base de datos:Cdigo :

    'database' => 'pruebalaravel',

    Y ms abajo el usuario que hayan configurado cuando instalaronMySQL, comnmente root, luego, en la lnea siguiente, el password

    que dependiendo de su instalacin pudiese estar en blanco o seruna clave ultra secreta.

    Una vez configurada la DB, veamos:

    Cmo crear las tablas en la base de datos con Laravel

    Para ello usaremos migraciones.

    Las migraciones permiten configurar y modificar la estructurade una base de datos. Creando una especie de control deversiones de base de datosque puede ser usada por una o mspersonas dentro del equipo de desarrollo.

    Por ejemplo:

  • 5/22/2018 Documentacion Laravel

    60/226

    Inicialmente crearemos una tabla llamada users.En unas semanas necesitaremos otra tabla llamada tasks.Luego agregaremos un campo adicional llamado role en latablausers para dividir los administradores de los usuarios normales.

    Cada uno de estos pasos implicar crear una migracin diferentecon la que el framework sabr cmo modificar la base de datos,tanto hacia el nuevo esquema (del paso 1 al paso 2) como alesquema anterior (por ejemplo: de vuelta al paso 2 desde el paso3).

    Ahora veamos:

    Cmo instalar el sistema de migraciones en Laravel

    Abrimos nuestra consola o terminal (recuerden usar la consolainstalada por GIT si usan Windows) y tipeamos lo siguiente:Cdigo :

    php artisan migrate:install

    Artisan es la interface de comandos de consola que trae Laravel

    Si configuramos bien la base de datos deberamos recibir elsiguiente mensaje:Cdigo :

    Migrationtable created successfully

  • 5/22/2018 Documentacion Laravel

    61/226

    (Sino recibes este mensaje, vuelve al punto anterior sobreconfigurar la base de datos y revisa que todo est bien)

    Tab la de m igracin creada con xito?

    S, si vuelves a tu herramienta de base de datos (ej. PHPMyAdmin)vers la siguiente tabla:

    Esta es una sencilla tabla que usa Laravel para conocer el estadode la migracin en tu servidor, por ahora est vaca.

    Siguiente paso:

    Crear nuestra primera migracin con Artisan y Laravel

    Para ello ejecutamos el siguiente comando:Cdigo :

    php artisan migrate:make create_user_table

  • 5/22/2018 Documentacion Laravel

    62/226

    Si todo sali bien, recibiremos un mensaje similar a ste:Cdigo :

    Created Migration: 2013_09_03_211545_create_user_table

    Generatingoptimized classloader

    El primer mensaje (migracin creada) nos indica que fue creado el

    archivo donde vamos a:

    Crear el esquema de nuestra tabla usando el Schema Builder

    Abrimos el archivo localizado en:Cdigo :

    app/database/migrations/2013_09_03_211545_create_user_table.php

    El nombre del archivo adems de lo especificado por nosotros(create_user_table) contiene una fecha/hora que permite indicarle alframework el orden en que fueron creadas las migraciones, en micaso 2013_09_03_21...

    Ok, abrimos el archivo, tenemos la siguiente estructura:Cdigo :

  • 5/22/2018 Documentacion Laravel

    63/226

    use Illuminate\Database\Migrations\Migration;

    class CreateUserTable extends Migration {

    /**

    * Run the migrations.

    *

    * @return void

    */

    public function up()

    {

    //

    }

    /**

    * Reverse the migrations.

    *

    * @return void

    */

    public function down()

    {

    //

    }

  • 5/22/2018 Documentacion Laravel

    64/226

    }

    Bsicamente tenemos una clase llamada CreateUserTabley dentrotiene dos mtodos up and down.

    El mtodo upservir, en este caso, para definir nuestra tabla,reemplacemos el mtodo vaco por lo siguiente:Cdigo :

    /**

    * Run the migrations.

    *

    * @return void

    */

    public function up()

    {

    Schema::create('users', function($table)

    {

    $table->increments('id');

    $table->string('email');

    $table->string('password');

    $table->string('full_name');

  • 5/22/2018 Documentacion Laravel

    65/226

    $table->timestamps();

    });

    }

    Dentro tenemos un llamado al[url=http://es.wikipedia.org/wiki/Facade_(patr%C3%B3n_de_dise%C3%B1o)]facade[/url]Schema::createque nos permite crear elesquema de una tabla usando una interfaz de PHP orientada aobjetos, es decir, como si nuestra tabla fuera un objeto.

    Schema::createacepta como primer parmetro el nombre denuestra tabla, en este caso: users

    El segundo parmetro esuna closure o funcin annimaal cual sele inyecta el objeto $table, dicho objeto nos permitir definir loscampos de nuestra tabla, por ejemplo:

    Cdigo :

    $table->increments('id');

    Le dice a Laravel que nuestra tabla tendr uncampo de tipo autoincrementollamado id, el cual es muy comn en MySQL.

    Luego le decimos a Laravel que necesitamos un campo stringllamado email:Cdigo :

    $table->string('email');

    http://es.wikipedia.org/wiki/Facade_(patr%C3%B3n_de_dise%C3%B1o)%5dfacade%5b/urlhttp://es.wikipedia.org/wiki/Facade_(patr%C3%B3n_de_dise%C3%B1o)%5dfacade%5b/urlhttp://es.wikipedia.org/wiki/Facade_(patr%C3%B3n_de_dise%C3%B1o)%5dfacade%5b/urlhttp://php.net/manual/es/functions.anonymous.phphttp://php.net/manual/es/functions.anonymous.phphttp://php.net/manual/es/functions.anonymous.phphttp://dev.mysql.com/doc/refman/5.0/es/example-auto-increment.htmlhttp://dev.mysql.com/doc/refman/5.0/es/example-auto-increment.htmlhttp://dev.mysql.com/doc/refman/5.0/es/example-auto-increment.htmlhttp://dev.mysql.com/doc/refman/5.0/es/example-auto-increment.htmlhttp://dev.mysql.com/doc/refman/5.0/es/example-auto-increment.htmlhttp://dev.mysql.com/doc/refman/5.0/es/example-auto-increment.htmlhttp://php.net/manual/es/functions.anonymous.phphttp://es.wikipedia.org/wiki/Facade_(patr%C3%B3n_de_dise%C3%B1o)%5dfacade%5b/urlhttp://es.wikipedia.org/wiki/Facade_(patr%C3%B3n_de_dise%C3%B1o)%5dfacade%5b/url
  • 5/22/2018 Documentacion Laravel

    66/226

    Pero en MySQL no existe el campo de tipo string...

    Laravel se encarga de ello convirtiendo al tipo adecuado de acuerdoa la base de datos que hayamos configurado al principio, en el casode MySQL nuestro campo resultante ser de tipo VARCHAR.

    Lo mismo para password y full_name, al final tenemos lo siguiente:Cdigo :

    $table->timestamps();

    ?

    Bsicamente este mtodo le dice a Laravel que queremos crear 2campos, uno llamado created_at y otro updated_at ambos de tipo

    TIMESTAMP que servirn para saber cuando fue creado o

    modificado cada uno de los registros de nuestra tabla.

    Ok, Estn listos? Vamos a ejecutar la migracin: vamos de nuevoa la consola y escribimos lo siguiente:Cdigo :

    php artisan migrate

    Si todo sali bien recibiremos un mensaje as:Cdigo :

    Migrated2013_..._create_user_table

  • 5/22/2018 Documentacion Laravel

    67/226

    Ahora corremos a ver el PHPMyAdmin y

  • 5/22/2018 Documentacion Laravel

    68/226

    Voil!

    S que estn emocionados con nuestra nueva tabla, pero -aunquesuene doloroso- tendremos que deshacernos de ella, no se

    preocupen, crearemos una nueva ms tarde y nadienotar ladiferencia:

    Reemplacemos el mtodo down por lo siguiente:Cdigo :

    /**

    * Reverse the migrations.

    *

    * @return void

    */

    public function down()

    {

    Schema::drop('users');

    }

    S:

    Cdigo :

    Schema::drop('users');

    Es el fatdico mtodo que eliminarnuestra recin creada tabla

  • 5/22/2018 Documentacion Laravel

    69/226

    users, ahora tomen valor y escriban en la consola:Cdigo :

    php artisan migrate:rollback

    Recibiremos el siguiente mensaje:Cdigo :

    Rolledback: 2013...create_user_table

    Indicndonos que migracin se ha descartado. Corremos aPHPMyAdmin pero nuestra tabla users no est,its gone Se haido.

    No pu ede ser!

    Rpidamente regresamos a la consola y tipeamos de nuevo:

    Cdigo :

    php artisan migrate

    Volvemos a PHPMyAdmin y Nuestra tabla users est de nuevo connosotros! Djenla all por ahora, la necesitaremos en un prximo

    tutorial.

    Adems de agregar drama a nuestra vida, el rolled backsirve tantosi cometimos un error definiendo una tabla, como si queremosregresar nuestra base de datos a un estado anterior. Ms adelanteaprenderemos un poco ms sobre lasmigraciones en Laravel.

    http://laravel.com/docs/migrationshttp://laravel.com/docs/migrationshttp://laravel.com/docs/migrationshttp://laravel.com/docs/migrations
  • 5/22/2018 Documentacion Laravel

    70/226

    Es todo por ahora Qu les pareci el tutorial? Cuntanos en loscomentarios. Adems me gustara saber si quieren que les expliqueun poco mssobre programacin orientada a objetosen PHP 5.3,

    por ejemplo:Qu es un namespace?En un prximo tutorial.

    Usa los enlaces claves dentro del mismo tutorial para descubrirartculos interesantes relacionados con el tema.

    http://www.cristalab.com/programacion-orientada-objetos/http://www.cristalab.com/programacion-orientada-objetos/http://www.cristalab.com/programacion-orientada-objetos/http://www.php.net/manual/es/language.namespaces.phphttp://www.php.net/manual/es/language.namespaces.phphttp://www.php.net/manual/es/language.namespaces.phphttp://www.php.net/manual/es/language.namespaces.phphttp://www.cristalab.com/programacion-orientada-objetos/
  • 5/22/2018 Documentacion Laravel

    71/226

    2.3 - Primeros pasos con Laravel

    Ya sabes qu es Laravel,ya lo instalastey configuraste labase de datos?Muy bien, porque pronto comenzaremos aprogramar nuestro mdulo! Pero antes, en esta cuarta entrega,hablaremos un poco sobre cmo funciona la web:

    Los sitios web funcionan con unprotocolo llamado HTTPquepermite que un cliente se comunique con un servidor y viceversa.Veamos un par de grficos sencillos sobre esto:

    Veamos, esta es una sencilla peticin (request) donde tu navegador(Firefox) solicita obtener (GET) la informacin de la pginacristalab.com/tags/laravel. Una vez que leas el tutorial querrsdejar un comentario, para ello llenars el formulario al final del post

    y apretars el botn enviar comentario, en ese momento seproducir otra solicitud:

    http://www.cristalab.com/tutoriales/como-instalar-laravel-y-composer-c111363l/http://www.cristalab.com/tutoriales/como-instalar-laravel-y-composer-c111363l/http://www.cristalab.com/tutoriales/como-instalar-laravel-y-composer-c111363l/http://es.wikipedia.org/wiki/Hypertext_Transfer_Protocolhttp://es.wikipedia.org/wiki/Hypertext_Transfer_Protocolhttp://es.wikipedia.org/wiki/Hypertext_Transfer_Protocolhttp://es.wikipedia.org/wiki/Hypertext_Transfer_Protocolhttp://www.cristalab.com/tutoriales/como-instalar-laravel-y-composer-c111363l/
  • 5/22/2018 Documentacion Laravel

    72/226

    Ahora Firefox le dice al servidor de cristalab.com que quiere publicar(POST) un comentario, y obviamente le enva la informacincorrespondiente (tu email, tu comentario) y Cristalab devolver uncdigo 200 (todo bien, la pgina fue encontrada, el servidor funcionabien), sin embargo el HTML contendr un mensaje de xito o unmensaje de error.

    En resumen cada peticin (Request) tiene un verbo (GET, POSTson los ms comunes) y una direccin (cristalab.com/tags,laravel.com/docs, etc.). Una respuesta (Response), por otro lado, seconstituye de un cdigo (200 si todo est bien, 404 si no fueencontrada la pgina, 500 error de server, etc.) y el cuerpo de larespuesta, que es por lo general HTML.

    Los programadores expertos dirn:Y que hay de los HEADERS?Y las var iab les de ses in? No te o lv ides de las cook ies !

    Lo s, pero quera mantener esto sencillo; veamos, adems de loque ya les expliqu cada peticin y respuesta transporta otros datoscomo headers, variables de sesin y cookies.

  • 5/22/2018 Documentacion Laravel

    73/226

    Por ejemplo, un header en una peticin puede tener la informacinde la IP del usuario, en PHP pruebenimprimiendo$_SERVER['REMOTE_ADDR']o de donde proviene el

    usuario $_SERVER['HTTP_REFERER'] o el navegador que usa$_SERVER['HTTP_USER_AGENT']

    Ok pero esta informacin no es seguraDicen los expertos y s, tienen razn, pero mantengmoslo simplepor ahora.

    Las variables de sesin (Session) almacenan tu informacin

    cuando, por ejemplo, haces login en una pgina y se borran cuandohaces logout. Si le dices a un sitio web que recuerde tu usuario pordos semanas, probablemente eso vaya a una Cookie, que es unpequeo archivo que se almacena en tu computador. Ms adelanteveremos todo esto en detalle.

    Por ahora recuerden Solicitud = Verbo + Direccin. Respuesta =Cdigo + Texto.

    Ok, comencemos a programar con Laravel

    Est bien! Tranquilos. Vamos a comenzar abriendo el archivoapp/routes.php

    Listos?. En este archivo se manejan las rutas de Laravel. Es,digamos, la primera capa de nuestra aplicacin.

    http://php.net/manual/es/reserved.variables.server.phphttp://php.net/manual/es/reserved.variables.server.phphttp://php.net/manual/es/reserved.variables.server.phphttp://php.net/manual/es/reserved.variables.server.php
  • 5/22/2018 Documentacion Laravel

    74/226

    Y qu es lo que hace una ruta?

    Vern, una ruta recibe una peticin (Request) del usuario y luego deun determinado proceso debe devolver una respuesta (Response):

    Entonces esto:Cdigo :

    Route::get('/', function()

    {

    return View::make('hello');

    });

    Significa que cuando el usuario solicite (GET) la pgina de inicio ( / )va a recibir respuesta cdigo 200: todo bieny el HTML de la vistahello (views/hello.php).

    Como ven Laravel nos brinda una interfaz elegante y sencilla para

    poder manejar las solicitudes y devolver las respuestas adecuadas.

    Por debajo, Laravel se apoya en elexcelente componente HTTPFoundation de Symfony2que encapsula, mejora y normaliza todaslas funcionalidades que ya trae el lenguaje PHP para manejarrequests y responses.

    Obviamente nuestra aplicacin necesitar mucho ms que una

    pgina para funcionar, veamos cmo hacer una segunda pgina:

    Guindonos por la ruta inicial vamos a escribir otra debajo de esa,as:Cdigo :

    http://symfony.com/doc/current/components/http_foundation/introduction.htmlhttp://symfony.com/doc/current/components/http_foundation/introduction.htmlhttp://symfony.com/doc/current/components/http_foundation/introduction.htmlhttp://symfony.com/doc/current/components/http_foundation/introduction.htmlhttp://symfony.com/doc/current/components/http_foundation/introduction.htmlhttp://symfony.com/doc/current/components/http_foundation/introduction.html
  • 5/22/2018 Documentacion Laravel

    75/226

    Route::get('cristalab', function()

    {

    return View::make('cristalab');

    });

    Ahora copien y peguen el archivo app/views/hello.php dentro de lamisma carpeta, cambien el nombre a cristalab.php, y cambien elcontenido de app/views/cristalab.php que hay dentro del por este HTML:

    Cdigo :

  • 5/22/2018 Documentacion Laravel

    76/226

    complejas, por ejemplo:Cdigo :

    Route::get('hello/{usuario}', function($usuario)

    {

    return "Hello $usuario";

    });

    Si el resultado de una ruta es una cadena de texto (string), Laravel

    devolver una respuesta de tipo 200 (todo bien) y el cuerpo serdicho texto.

    Ahora en su navegador tipeen: hello/tu-nombre

    Exacto! As pueden tener una URL dinmica que responda acualquier nombre. Lo mismo nos servira para tags, tutoriales, etc.Otro ejemplo:

    Cdigo :

    Route::get('tags/{tag}', function($tag)

    {

    return "You are browsing $tag tag";

    });

    Quieren limitar un parmetro a que slo sea nmeros, porejemplo? Sencillo:Cdigo :

  • 5/22/2018 Documentacion Laravel

    77/226

    Route::get('user/edit/{id}', function($id)

    {

    return"You are editing the user with the ID #$id";

    })

    ->where('id', '[0-9]+');

    Noten el mtodo where que se concatena a nuestra ruta y

    usandouna expresin regularmuy simple ([0-9]+) se limita a que el

    parmetro id sea compuesto por uno o ms nmeros del 0 al 9.

    Tipeen user/edit/5y recibirn el mensaje: "You are editing theuser with the ID #5". Pero si ahora tipean user/edit/laravel recibirnun error 404 dado que ni esta ni otra ruta coincide con nuestrapeticin.

    Laravel nos brindaotros tipos de respuestasque analizaremos ms

    adelante.

    Tambin veremos las rutas ms a fondo as como la creacin decontroladores en un prximo captulo.

    http://bulma.net/body.phtml?nIdNoticia=770http://bulma.net/body.phtml?nIdNoticia=770http://bulma.net/body.phtml?nIdNoticia=770http://laravel.com/docs/responseshttp://laravel.com/docs/responseshttp://laravel.com/docs/responseshttp://laravel.com/docs/responseshttp://bulma.net/body.phtml?nIdNoticia=770
  • 5/22/2018 Documentacion Laravel

    78/226

    2.4 - Controladores y MVC conLaravel

    Hoy quiero que aprendamos sobre los controladores con Laravel.Cuando se habla delpatrn MVC (Modelo-Vista-Controlador)sedice que:Un controlador es la capa intermediaria encargada de invocar a los

    modelos y pasar datos a las vistasLaravel es compatible con el patrn MVC (por ejemplo: en la carpetaapps/ 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 unrestaurante. Los comensales (Usuarios)son recibidos por nuestroanfitrin Laravel. Laravelse encarga de llevarlos dentro del

    restaurante (Aplicacin)donde los esperan los mesoneros (Rutas).

    Cada mesonero (Ruta)se encarga de tomar nota delpedido (Solicitud o Request)de cada comensal (Usuario)y dedirigirlo a la estacin adecuada. Por ejemplo: si ordeno coctelesnuestro mesonero (ruta) llevar el pedido (request) al bar, si ordenouna pasta con albndigas dicho pedido ser llevado por elmesonero (ruta) a la estacin de cocina italiana.

    En este ejemplo, los Controladoresson los encargados de cadaestacin (bar, comida italiana, comida mexicana, etc.).

    Por ejemplo, nuestro maestro de cocina italiana que acaba de recibirel pedido de albndigas y pasta, es un controlador.

    http://es.wikipedia.org/wiki/Modelo_Vista_Controladorhttp://es.wikipedia.org/wiki/Modelo_Vista_Controladorhttp://es.wikipedia.org/wiki/Modelo_Vista_Controladorhttp://es.wikipedia.org/wiki/Modelo_Vista_Controlador
  • 5/22/2018 Documentacion Laravel

    79/226

    De qu se encargar? De cocinar? Absolutamente NO! Elcontrolador solamente debe encargarse de dirigir la operacin. Poreso, 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 vercdigo, so, here we go:

    Cdigo :

  • 5/22/2018 Documentacion Laravel

    80/226

    protected $meatRepo;

    protected $sauceRepo;

    public function __construct(PastaRepoInterface $pasta,

    MeatRepoInterface $meat, SauceRepoInterface $sauce)

    {

    $this->pastaRepo = $pasta;

    $this->meatRepo = $meat;

    $this->sauceRepo = $sauce;

    }

    publicfunctionpastaWithMeatballs($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

  • 5/22/2018 Documentacion Laravel

    81/226

    {

    return Redirect::route(table, array($idTable)-

    >with(message,Porfavor 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 puedenpreparar comida por nosotros, eso sera genial, pero si leyeron endetalle el cdigo descrito arriba y lo entienden han dado un granpaso para ser buenos chefs, quiero decir, programadores enLaravel.

    Examinemos el cdigo:

    Cmo darle nombre a una ruta y enlazarla a un controlador

    Cdigo :

  • 5/22/2018 Documentacion Laravel

    82/226

    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 funcinannima,como en los ejemplos anteriores.

    Ahora es un array:

    El parmetro as define el nombre de la ruta, suponiendo queescribimos nuestra vista views/menu.blade.php podremos colocar elenlace a nuestra ruta as:Cdigo :

    Pasta larga

    Pasta corta

    O un redirect:Cdigo :

    http://www.cristalab.com/tutoriales/primeros-pasos-con-laravel-c111484l/http://www.cristalab.com/tutoriales/primeros-pasos-con-laravel-c111484l/http://www.cristalab.com/tutoriales/primeros-pasos-con-laravel-c111484l/http://www.cristalab.com/tutoriales/primeros-pasos-con-laravel-c111484l/
  • 5/22/2018 Documentacion Laravel

    83/226

    Redirect::route(pasta_meatballs)

    El nombre de la ruta NO es la URLDe hecho, ms adelantepodramos cambiar la URL a pasta-con-albondigas y el men y elRedirect 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 yotras 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 pornosotros la Estacin de comida italiana ItalianControllery asignarlos chefs (clases, repositorios) para la pasta, la carne y la salsa, yuna 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 claseItalianController:Cdigo :

    http://php.net/manual/es/language.oop5.autoload.phphttp://php.net/manual/es/language.oop5.autoload.phphttp://php.net/manual/es/language.oop5.autoload.phphttp://php.net/manual/es/language.oop5.autoload.php
  • 5/22/2018 Documentacion Laravel

    84/226

    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 cadavez quecreamos un objeto

    Pero de dnde salen esos parmet ros $pas ta, $meat, $sauce?

    Laravel los crea y asigna por nosotros automticamente!, siempreque las interfaces existan y haya al menos una clase queimplemente 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 programarlos repositorios y modelosy tambin lasinterfaces

    http://php.net/manual/es/language.oop5.decon.phphttp://php.net/manual/es/language.oop5.decon.phphttp://php.net/manual/es/language.oop5.decon.phphttp://www.cristalab.com/programacion-orientada-objetos/como-escribir-clases/http://www.cristalab.com/programacion-orientada-objetos/como-escribir-clases/http://www.cristalab.com/programacion-orientada-objetos/como-escribir-clases/http://php.net/manual/es/language.oop5.interfaces.phphttp://php.net/manual/es/language.oop5.interfaces.phphttp://php.net/manual/es/language.oop5.interfaces.phphttp://php.net/manual/es/language.oop5.interfaces.phphttp://www.cristalab.com/programacion-orientada-objetos/como-escribir-clases/http://php.net/manual/es/language.oop5.decon.php
  • 5/22/2018 Documentacion Laravel

    85/226

    Qu es una Interfaz

    Una interfaz, es como un contrato que permite definir los mtodos

    (funcionalidades) mnimosque una clase debe tener. En s NOimplementa cdigo, slo sirve para definir los requerimientos delas clases de cierto tipo. En nuestro ejemplo, los requisitosmnimos que nuestro restaurante exige para contratar a un chef depasta, seran:Cdigo :

    // app/models/PastaRepoInterface

    interface PastaRepoInterface {

    public function cookSpaghetti();

    public function cookRigatoni();

    public function cookLasagne();

    }

    Debe saber cmo preparar espagueti, rigatonis, y lasaa,whynot?

    Ahora si queremos crear un chef encargado de proveerle pasta a lascocinas escribiramos lo siguiente:Cdigo :

  • 5/22/2018 Documentacion Laravel

    86/226

    // 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 cambiarnuestro especialista en pastas, slo tendramos que regresar aapp/start/globals.php y decirle a Laravel:Cdigo :

  • 5/22/2018 Documentacion Laravel

    87/226

    //app/start/globals.php

    App::bind(PastaRepoInterface,MongoPastaRepo);

    Que ahora nuestro Chef de Pastas no serEloquentsinoMongo.

    Siempre que el nuevo chef MongoPastaRepoimplemente lainterfaz PastaRepoInterfacenuestra cocina seguirfuncionando sin ningn tipo de cambio adicional. Genial No?

    Por cierto, las recetasen este caso seran la lgica de nuestraaplicacino lgica de negocios. En este caso todas las hemospuesto dentro de nuestra carpeta de modelos, como debe ser.

    Vistas o Capa de Presentacin

    Una vez que el controlador ItalianController obtiene toda la comidanecesaria para crear nuestra pasta con albndigas:Cdigo :

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

    Esta se pasa a la vista, que en nuestro ejemplo sera la estacin

    encargada de decorar el plato para que no slo tenga lacomida (data)adecuada sino que luzca bien (diseo, layouts,HTML5).

    Pero no siempre necesitaremos una capa de presentacin.Qu pasa si el usuario pide su comida para llevar, por ejemplo?

    http://laravel.com/docs/eloquenthttp://laravel.com/docs/eloquenthttp://laravel.com/docs/eloquenthttp://www.mongodb.org/http://www.mongodb.org/http://www.mongodb.org/http://www.mongodb.org/http://laravel.com/docs/eloquent
  • 5/22/2018 Documentacion Laravel

    88/226

    Slo habra que entregarla en un envase, sin platos, sin adornos, sinHTML, A qu les recuerda eso? Cuando hacemos unapeticin AJAX, el servidor simplemente nos devuelve los datos enformato JSON:

    Cdigo :

    returnResponse::json($food);

    Cmo redirigir una accin a otra ruta

    Fjense qu pasa si el tipo de pasta ($type) solicitado no es long nishort:

    Cdigo :

    return Redirect::route(table, array($idTable))-

    >with(message,Porfavor elija pasta corta o pasta larga);

    De una manera muy sencilla le decimos a Laravel que redirija lapeticin del usuario de nuevo a su mesa, donde le pediremos quepor favor elija pasta corta o larga.

    Por supuesto necesitaramos definir otra ruta:Cdigo :

  • 5/22/2018 Documentacion Laravel

    89/226

    //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 loscontroladores, cmo se crean y usan en Laravel, tambinaprendimos cmo enlazar las rutas a ellos y aprendimos sobreRepositorios e Interfaces que mantienen la lgica yresponsabilidades 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 algocomo: Pero yo no necesito unrestaurante o aplicacin tanelegante. Yo hago pginas web ms sencillas.

    Con Laravel podramos hacer esto:

    Cdigo :

  • 5/22/2018 Documentacion Laravel

    90/226

    // app/routes.php

    Route::get(pasta-with-meatballs, function () {

    $pasta = Pasta::where(type, =, short)->get();

    // Etc. Etc.

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