laravel_codeha

download laravel_codeha

of 140

Transcript of laravel_codeha

  • Laravel: Code Happy (ES)Desarrollo de aplicaciones con el Framework de PHPLaravel para principiantes.

    Dayle Rees and Antonio LagunaThis book is for sale at http://leanpub.com/codehappy-es

    This version was published on 2013-02-06

    This is a Leanpub book. Leanpub empowers authors and publishers with the Lean Publishingprocess. Lean Publishing is the act of publishing an in-progress ebook using lightweight toolsand many iterations to get reader feedback, pivot until you have the right book and buildtraction once you do.

    2012 - 2013 Dayle Rees.

  • Tweet This Book!Please help Dayle Rees and Antonio Laguna by spreading the word about this book on Twitter!The suggested hashtag for this book is #codehappy.Find out what other people are saying about the book by clicking on this link to search for thishashtag on Twitter:https://twitter.com/search/#codehappy

  • ndice generalReconocimiento i

    Reconocimientos del traductor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i

    Erratas ii

    Feedback iii

    Introduccin iv

    1 Comenzando 11.1 Mtodo 1 Crea un nuevo host virtual . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Mtodo 2 Enlace simblico a la carpeta pblica . . . . . . . . . . . . . . . . . . 21.3 Centrndonos de nuevo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    2 Estructura de proyectos 42.1 Estructura del directorio raz . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.2 Estructura del directorio Application . . . . . . . . . . . . . . . . . . . . . . . . 5

    3 Usando controladores 83.1 Enrutando controladores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83.2 Pasando parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103.3 Usando vistas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103.4 Controladores RESTful . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.5 El controlador base, Base_Controller . . . . . . . . . . . . . . . . . . . . . . . . 133.6 Enrutamiento avanzado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    4 Rutas con closures 154.1 Closures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154.2 Redirecciones y rutas con nombre . . . . . . . . . . . . . . . . . . . . . . . . . . 164.3 Filtros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174.4 Grupos de rutas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

  • NDICE GENERAL

    5 Enlaces y URLs 205.1 Obteniendo URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205.2 Generando enlaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

    6 Formularios 256.1 Creando formularios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256.2 Aadiendo etiquetas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266.3 Generando campos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276.4 Generando botones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286.5 Campos secretos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286.6 Token CSRF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286.7 Macros de formulario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

    7 Gestionando la entrada de datos 307.1 Datos de peticiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307.2 Archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317.3 Datos flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

    8 Validacin 348.1 Estableciendo una validacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348.2 Errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368.3 Reglas de validacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378.4 Mensajes de error personalizados . . . . . . . . . . . . . . . . . . . . . . . . . . 398.5 Reglas de validacin personalizadas . . . . . . . . . . . . . . . . . . . . . . . . . 408.6 Clases de validacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

    9 Migraciones 429.1 Configuracin de la base de datos . . . . . . . . . . . . . . . . . . . . . . . . . . 429.2 Migraciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

    10 Fluent Query Builder 4710.1 Obteniendo resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4810.2 Clausulas WHERE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4810.3 Joins de tablas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5110.4 Ordenacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

  • NDICE GENERAL

    10.5 Limitando no, cogiendo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5210.6 Saltndonos resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5210.7 Agregados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5210.8 Expresiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5310.9 ++ (o decremento) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5310.10 Insertar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5310.11 Actualizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5410.12 Borrar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

    11 ORM Eloquent 5611.1 Creando y usando modelos de Eloquent . . . . . . . . . . . . . . . . . . . . . . 5611.2 Relaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6011.3 Insertando modelos relacionados . . . . . . . . . . . . . . . . . . . . . . . . . . 6411.4 Tablas pivote . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6511.5 Carga anticipada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6611.6 Setters y Getters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

    12 Eventos 6912.1 Activa un evento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6912.2 Escucha un Evento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7012.3 Eventos con parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7012.4 Eventos de Laravel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7012.5 Ejemplo de uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

    13 Plantillas Blade 7313.1 Lo bsico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7313.2 Lgica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7313.3 Distribuciones de Blade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

    14 Autentificacin 7714.1 Configuracin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7714.2 Configurando el formulario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7914.3 Gestionando el inicio de sesin . . . . . . . . . . . . . . . . . . . . . . . . . . . 8014.4 Protegiendo rutas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8214.5 Personalizacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

  • NDICE GENERAL

    15 El tutorial del Blog 8615.1 El diseo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8615.2 Configuracin bsica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8715.3 Modelos Eloquent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8815.4 Rutas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8915.5 Vistas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9015.6 A programar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9215.7 El futuro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

    16 Pruebas unitarias 9816.1 Instalacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9816.2 Creando una prueba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9816.3 Ejecutando pruebas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9916.4 Probando el ncleo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

    17 Cach 10217.1 Configuracin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10217.2 Estableciendo valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10217.3 Obteniendo valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10217.4 Una forma mejor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

    18 Autocarga de clases 10418.1 Asociacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10418.2 Carga de directorios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10518.3 Asociacin por espacio de nombre . . . . . . . . . . . . . . . . . . . . . . . . . 10518.4 Asociando guiones bajos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

    19 Configuracin 10719.1 Creando nuevos archivos de configuracin . . . . . . . . . . . . . . . . . . . . . 10719.2 Leyendo configuracin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10819.3 Estableciendo la configuracin . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

    20 El contenedor IoC 11020.1 Registrando objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11020.2 Resolviendo objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11120.3 Singletons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

  • NDICE GENERAL

    21 Encriptacin 11421.1 Encriptacin en un sentido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11421.2 Encriptacin en ambos sentidos . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

    22 Contenido AJAX 11622.1 Plantilla de la pgina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11622.2 El JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11722.3 Envo de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12022.4 Respuestas JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12122.5 Detectando una peticin AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

    23 Debugueando Aplicaciones 12323.1 Gestor de errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12323.2 Configuracin de errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12423.3 Registro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

  • ReconocimientoAntes que nada, me gustara agradecer a mi novia Emma, no solo por apoyarme en todas misideas frikis, sino por hacer la increble foto del panda rojo para la portada del libro! Te amoEmma!A Taylor Otwell, tambin te quiero to, pero de forma totalmente varonil. Gracias por hacer unframework que es realmente un placer usar, hace que nuestro cdigo se lea como poesa y pordedicar tanto tiempo y pasin en su desarrollo.Eric Barnes, Phill Sparks, Shawn McCool, Jason Lewis, Ian Landsman, gracias por todo el apoyocon el framework, y por permitirme ser parte de un proyecto con tanto potencial.A todos los lectores de mi blog que mostraron inters en mis tutoriales, gracias! Sin vosotrosnunca habra tenido la confianza de escribir un libro.

    Reconocimientos del traductorMe gustara agradecer a mi mujer, Laura, todo el apoyo que me ha ofrecido. Especialmenteteniendo en cuenta que me he tomado parte de las vacaciones para ponerme a traducir este libro.Al seor Dayle Rees, por dejarme ser parte de este proyecto y brindarme esta oportunidad. Hasido un placer trabajar contigo y todo un desafo el traducir este estilo tan desenfadado que tecaracteriza.Por supuesto a Taylor Otwell, este framework es una gozada. Es una gozada de programar y deleer y estoy seguro de que aun le queda mucho camino por recorrer. No quiero ni imaginar loque cuece para la versin 4.0.A todos aquellos que leis mis artculos en mi blog, gracias por tomaros el tiempo de escribirmecomentarios de mandarme correos y de apreciar el trabajo que se hace. Espero que lo disfrutis.

    i

  • ErratasAunque haya tenido todo el cuidado del mundo para asegurarme de que el libro no tiene errores,algunas veces unos ojos cansados juegan malas pasadas, y los errores escapan al radar. Si teencuentras con algn error en el libro, ya sea de escritura o de cdigo, te agradecer mucho sipudieras avisarme de su presencia envindome un correo a [email protected] incluyendo elcaptulo y la ubicacin del error.Los errores sern solucionados conforme vayan siendo descubiertos, y las correcciones sernlanzadas con la prxima publicacin del libro.

    mailto:[email protected]

    ii

  • FeedbackDe igual forma, puedes enviarme cualquier comentario que puedas tener sobre el contenidodel libro envindome un correo a [email protected]. Me comprometo a responder todos loscorreos que reciba sobre el libro.

    mailto:[email protected]

    iii

  • IntroduccinHola! Soy Dayle Rees, y voy a ser vuestro gua en este mgico viaje hacia el mundo de Laravel!Vale, pensndolo mejor, eso me qued realmente cursi. Este que ves es mi primer libro, por loque voy no tengo mucha prctica con toda la jerga literaria de alto nivel, por lo que si te gustaun texto directo, y ser hablado como si fueras un ser humano, estamos en el mismo barcoentonces!Os estaris preguntando Por qu debera confiar en este to para que me ensee Laravel? Nisiquiera es un autor experimentado!Lo que me falta de experiencia, lo tengo de entusiasmo. Soy un gran fan del desarrollo web, ylas herramientas y trucos que nos ahorran tiempo, o hacen nuestro trabajo mucho ms fcil.Laravel cumple ambos requisitos, y es una de las piezas de software ms tiles que jams hayadescubierto. De hecho, mi entusiasmo y pasin por el framework, que solo tiene rivalidad conel autor del framework me han llevado a ser includo como miembro del equipo de Laravel, oConcilio como nos gusta llamarlo. Suena mejor, verdad?Estar en el Concilio me otorga ciertos privilegios como ser notificado de nuevas ideas y adicionesplaneadas al framework, y contribuyendo al framework estoy constantemente en contacto conel cdigo que est en constante desarrollo. Esto me deja en una gran posicin para mantener ellibro actualizado, lo cual pretendo hacer con cada futuro lanzamiento del framework.Aunque no me gusta salirme del tema, me parece obligatorio tener un pequeo prrafo sobreel autor de libros de este tipo, por lo que vamos a hacerlo corto y agradable. Vivo en lacosta de Gales (es un pas del lado de Inglaterra para los que seis del otro lado del charco)y trabajo para una gran organizacin del sector pblico en Aberystwyth. En mi tiempo libreestoy realmente involucrado con Laravel. Oh, y como he dicho antes, no me considero un genioliterario, seamos sinceros mi escritura va a ser penosa, no va a ser tan buena como la de otroslibros de programacin. Os hablar como una persona real, a la que podras responder tambin,ya lo veremos. Con un poco de suerte, mi pasin por Laravel compensar mi Ingls comn (paraser justos, soy Gals). Ya no necesitas saber ms sobre mi, centrmonos ahora en Laravel.Laravel es un soplo de aire fresco en el mundo de PHP. El lenguaje de programacin PHP eshabitualmente conocido por sus horribles nombres de funciones, y aunque los desarrolladoresPHP hemos aprendido a quererlo, la sintaxis puede ser un poco fea comparada con algunoslenguajes Japoneses modernos. Hola Ruby!Afortunadamente Laravel cambia todo esto, de hecho creo que la sintaxis de Laravel (que estconstruido sobre PHP) es tan expresiva y cuidada, que la encuentro mucho ms sencilla de leerque Ruby. No es muy compacta, y aunque no se lea como una frase en ingls, se lee como unapoesa que solo puede ser leida por los ojos de un programador.

    Pero Dayle

    Digamos que de repente te asalta la idea de que podras haber gastado tus $4.99 en una bebidadivertida.

    Laravel es un framework, no un lenguaje!

    iv

  • Introduccin v

    Es cierto, me has pillado. Laravel puede que no sea un lenguaje, pero no tiene porqu serlo. Nosgusta PHP, vamos, seamos sinceros, aguantamos su fealdad, disfrutamos escribiendo todas esasllaves y puntos y comas. Laravel simplemente aade los atajos, o cambios sobre el cdigo parahacer la experiencia mucho ms agradable.Creo que el placer de trabajar con el framework, viene dado por sus expresivos mtodos queson consistentes en todo el framework. Str::upper() Intenta decirme que no sabes lo que hace,intenta decirme que no tiene sentido.

    No puedo.

    Sip, eso pensaba. Bueno, podra estar todo el da parloteando sobre todo lo que hace a Laravelmaravilloso, veamos, est Eloquent, el mejor ORM que haya visto nunca. Fue lo primero que metrajo al framework.La opcin de usar clausuras (closures) para rutas, pero solo si quieres. Creo que se ven geniales!No tener que cargar libreras antes de usarlas, s me has odo bien. Lo vers en accin mstarde.No, hay demasiadas caractersticas increibles para explicar aqu, creo que sera mejor si nossumergimos y comenzamos a aprender, despus de todo si gastaste $4.99 en esto en vez dealguna bebida divertida, ya debes de tener interes en el framework verdad? Adelante!

  • 1 ComenzandoLaravel es un framework de aplicaciones para PHP 5.3 escrito por Taylor Otwell. Fue escritocon las caractersticas de PHP 5.3 en mente. La combinacin de esas caractersticas y su expresivasintaxis le han granjeado al framework bastante popularidad.En este libro exploraremos Laravel desde los cimientos comenzando con su instalacin, y estoyseguro de que coincidiris conmigo en que es pan comido.Para poder usar cualquier framework PHP (no solo Laravel) necesitars tener un servidor webcon PHP 5.3 activo, recomendara instalar un servidor web en tu mquina local de desarrollo,para permitirte probar tu trabajo sin tener que subir los archivos cada vez que hagas un cambio.Este captulo asume que:

    Tienes un servidor web, basado en Apache, funcionando. Ests familiarizado con el sistema de archivos del servidor, y sabes cmo mover / copiarficheros.

    Tienes acceso para modificar los archivos de configuracin de Apache.

    Si ests usando un servidor web diferente, podrs encontrar muchos artculos en la red sobrecmo llevar a cabo las tareas que encontrars abajo para tu servidor.Primero, necesitaremos una copia del cdigo fuente del framework, simplemente dirgete aLaravel.com y dale al gran botn naranja de descarga. Para mayor seguridad, recomendaraextraer los contenidos del paquete a algn otro sitio que no fuera la raz de tu web. Guarda unanota mental de dnde dejaste el cdigo fuente (o busca un postit!).Ahora tenemos dos opciones para permitir al framework ejecutarse como debe. Yo recomendaraintentar el primermtodo ya que es la forma real de instalar el framework y nos permite realizaruna configuracin ms detallada. No obstante, encuentro el segundo mtodo mucho ms sencilloal trabajar con muchos proyectos en un servidor de desarrollo.

    1.1 Mtodo 1 Crea un nuevo host virtualTendremos que crear un nuevo archivo de configuracin de Apache. En la mayora de lasinstalaciones estndar, creando un archivo miproyecto.conf en la carpeta conf.d de Apache,lo incluir por defecto. Por favor, revisa la documentacin de tu configuracin actual para msinformacin.Dentro de tu nuevo archivo de configuracin, pega/escribe la siguiente declaracin del hostvirtual:

    http://laravel.comhttps://twitter.com/#!/taylorotwellhttp://laravel.com

    1

  • Comenzando 2

    1 2 DocumentRoot "/ruta/al/proyecto/de/laravel/public"3 ServerName miproyecto4 5 Options Indexes FollowSymLinks MultiViews6 AllowOverride all7 8

    Tenemos que actualizar la direccin IP a una que no est actualmente en uso. (Mejor no usar127.0.0.1, esta es nuestra direccin loopback, y puede que ya tengas algo que la est usando.)Cambia ambas rutas para que apunten a la carpeta public del cdigo de Laravel. Ahora, reiniciatu servidor web.Ahora tenemos que crear una nueva entrada en la DNS local para apuntar el nombre delproyecto a tu host virtual. Primero abre el fichero hosts que normalmente se encuentra enc:\windows\system32\drivers\etc\hosts en Windows o /etc/hosts en sistemas basados enunix.Aade la siguiente lnea usando la direccin IP que usaste en la declaracin de tu host virtual, yun nombre para tu proyecto:

    1 127.0.0.2 miproyecto

    Ahora deberas de poder navegar a: http://miproyectocon tu navegador web, y ver la pgina de bienvenida de Laravel.

    1.2 Mtodo 2 Enlace simblico a la carpeta pblicaSi ests familiarizado con el uso de enlaces simblicos en sistemas basados en unix, este mtodoser bastante sencillo.Dentro del cdigo que extrajiste (recuerdas dnde lo dejaste, verdad?) encontrars una subcarpeta llamada public. Esta carpeta contiene el archivo de inicializacin de Laravel y todos loselementos pblicos. Enlazaremos esta carpeta de forma simblica con la raz pblica de tu web(posiblemente /var/www/html/).Para crear el enlace simblico solo tienes que ejecutar el siguiente comando en la terminal de tueleccin, reemplazando las rutas donde sea necesario.

    1 ln -s /ruta/a/la/carpeta/public/de/laravel /ruta/a/la/carpeta/root/de/la/we\2 b/subdirectorio

    Por ejemplo :

  • Comenzando 3

    1 ln -s /home/dayle/laravel/miaplicacion/public /var/www/html/miaplicacion

    Nota: Tambin puedes hacer un enlace simblico a la carpeta pblica de la raz de tu webdirectamente, pero prefiero usar un subdirectorio para poder trabajar en varios proyectos.Ahora deberas de poder navegar a: http://localhost/myappcon tu navegador web, y ver la pgina de bienvenida de Laravel.

    1.3 Centrndonos de nuevoEn este punto deberas poder ver la pgina de bienvenida de Laravel, si es asEnhorabuena! Ahora tienes un nuevo proyecto de Laravel, ya ests preparado para empezara programar!En el prximo captulo cubriremos la estructura de proyectos de Laravel, y explicaremos cadauno de los archivos y carpetas importantes.Si encuentras alguno de los temas tratados en este libro algo confusos, puedes usar los siguientesenlaces para encontrar la ayuda y el soporte que necesitas, o simplemente escribir un nuevocomentario en DayleRees.com (en Ingls).

    Web de Laravel Documentacin de Laravel API de Laravel Foros de Laravel

    No dejes de unirte a nuestra comunidad en continua expansin usando un cliente de IRC paraconectarte a irc.freenode.net:6667 y unirte al canal de #laravel!

    http://daylerees.comhttp://laravel.comhttp://laravel.com/docshttp://laravel.com/apihttp://forums.laravel.com

  • 2 Estructura de proyectosEl paquete fuente de Laravel contiene varios directorios. Vamos a echar un vistazo a la estructuradel proyecto para conseguir una mayor comprensin de cmo funcionan las cosas. Puede queuse algunos trminos para describir algunas caractersticas de Laravel que puedan sonar algoconfusas si ests comenzando ahora mismo, si es as, no te preocupes porque cubriremos cadacaracterstica en posteriores captulos.

    2.1 Estructura del directorio razEchemos un vistazo a la estructura de ficheros y directorios de primer nivel:

    1 /application2 /bundles3 /laravel4 /public5 /storage6 /vendor7 /artisan [archivo]8 /paths.php [archivo]

    Ahora centrmonos en uno cada vez:/applicationAqu es donde estar la mayora del cdigo de tu aplicacin. Contiene tus rutas, modelos de datosy vistas. Pasars aqu la mayor parte del tiempo!/bundlesLos Bundles son aplicaciones de Laravel. Se pueden usar para separar aspectos de tu aplicacin,o pueden ser lanzados / descargados para compartir cdigo comn. Instalando nuevos bundlescon artisan, puedes extender la funcionalidad de Laravel para ajustarla a tus necesidades.Curiosamente, el directorio /application es tambin un bundle conocido como DEFAULT_-BUNDLE, lo que significa que cualquier cosa que uses en /application, puedes usarlatambin en tus bundles!/laravelAqu es donde se encuentran los archivos del ncleo del framework. stos son archivos quenecesita para ejecutar una peticin. Raramente tendrs que interactuar con este directorio, peroa veces puede resultar til revisar el cdigo fuente para ver cmo funciona una Clase o Mtodo.De manera alternativa, tambin puedes revisar el API de Laravel./public

    http://bundles.laravel.com/http://laravel.com/api

    4

  • Estructura de proyectos 5

    Este es el directorio al que debes aputnar tu servidor web. Contiene el archivo de inicializacinindex.php que hace funcionar el framework de Laravel, y el proceso de enrutado. El directoriopblico tambin puede ser usado para almacenar recursos pblicamente accesibles como CSS,JavaScript, archivos e imgenes. La subcarpeta laravel contiene los archivos necesarios paramostrar la documentacin sin conexin correctamente./storageEl directorio de almacenamiento se usa como almacn de archivos para servicios que usen elsistema de ficheros como driver, por ejemplo la clase Sessions o Cache. Este directorio debe poderser escrito por el servidor-web. No tendrs que interactuar con este directorio para construir unaaplicacin Laravel./vendorEste directorio contiene cdigo usado por Laravel, pero que no fue escrito por el autor delframework o los contribuyentes. La carpeta contiene software de cdigo abierto, o partes desoftware que contribuyen a las caractersticas de Laravel./artisan [archivo]Artisan es la interfaz de lnea de comandos de Laravel (CLI). Te permite realizar numerosastareas en la lnea de comandos. Incluso puedes crear tus propias tareas! Para ejecutar Artisansimplemente escribe:

    1 php artisan

    /paths.php [archivo]Este archivo es usado por el Framework para determinar rutas a los directorios importantes arribamencionado, y para facilitar un atajo para obtenerlos ( usando path()). No deberas necesitareditar este archivo.

    2.2 Estructura del directorio ApplicationComo mencionamos anteriormente, /application es donde ocurre toda la diversin, por lo queechmosle un vistazo a la estructura del directorio /application.

    1 /config2 /controllers3 /language4 /libraries5 /migrations6 /models7 /tasks8 /tests9 /views

    http://laravel.com/docs/artisan/commands

  • Estructura de proyectos 6

    10 /bundles.php [archivo]11 /routes.php [archivo]12 /start.php [archivo]

    Y ahora vamos a ver cada uno con detenimiento./configLa carpeta config contiene un varios archivos de configuracin para cambiar varios aspectosdel framework. No hace falta cambiar las configuraciones en la instalacin para que funcioneel framework recin salido del horno. La mayora de los archivos de configuracin devuelvenuna matriz de opciones de tipo clave-valor, algunas veces clave-closure que permiten una granlibertad de modificar el funcionamiento interno de algunas de las clases del ncleo de Laravel./controllersLaravel facilita dos mtodos para el enrutado, el uso de controllers (controladores) y el usode routes (rutas). Esta carpet acontiene las clases Controlador que son usadas para facilitar unalgica bsica, interactuar con los modelos de datos, y cargar archivos de vistas para tu aplicacin.Los controladores se aadieron al framework posteriormente para ofrecer un entorno msfamiliar a usuarios que estuvieran migrando desde otros frameworks. Aunque fueron aadidosa posteriori, gracias al potente sistema de enrutado de Laravel, te permiten realizar cualquieraccin que pueda ser realizada usando rutas a closures./languageEn este directorio se encuentran archivos PHP con matrices de cadenas para facilitar unatraduccin sencilla de aplicaciones creadas con Laravel. Por defecto, el directorio contiene unarchivo de cadenas para la paginacin y validacin del formulario en Ingls./librariesEste directorio puede ser usado para soltar libreras PHP de una sola clase para aadirfuncionalidad extra a tu aplicacin. Para Libreras ms grandes es recomendable crear un Bundle.La carpeta Libreras se aade al autocargador al inicio, en el archivo start.php./migrationsEsta carpeta contiene clases PHP que permiten a Laravel actualizar el esquema de tu base dedatos actual, o rellenarla con valores mientras mantiene todas las versiones de la aplicacinsincronizadas. Los archivos de migracin no se deben crear a mano, ya que el nombre del archivocontiene una marca de tiempo. En vez de eso, usa el comando de la interfaz CLI de Artisan phpartisan migrate:make para crear una nueva migracin./modelsLos modelos son las clases que representan los datos de tu proyecto. Normalmente implicarnintegracin con algn tipo de base de datos u otra fuente de datos. Laravel facilita tres mtodospara interactuar con plataformas comunes de bases de datos, incluyendo un constructor deconsultas llamado Fluent, que te permite crear consultas SQL encadenando mtodos PHP, usarel ORM (mapeo de objetos relacional) Eloquent para representar tus tablas como objetos PHP,

    http://laravel.com/docs/database/fluent

  • Estructura de proyectos 7

    o las antiguas consultas SQL planas a las que ests acostumbrado. Tanto Fluent como Eloquentusan una sintaxis similar, haciendo que su adopcin sea una sencilla transicin.El directorio models se carga de forma automtica desde start.php./tasksCreando clases en el directorio tasks, podrs aadir tus propias tareas personalizadas a la interfazde lnea de comandos de Artisan. Las tareas se representan como clases y mtodos./testsLa carpeta tests facilita una ubicacin para que mantengas las pruebas unitarias de tu aplicacin.Si ests usando PHPUnit, puedes ejecutar todas las pruebas a la vez usando la interfaz de lneade comandos de Artisan./viewsEl directorio views contiene todos los archivos de plantillas HTML que sern usados por loscontroladores o las rutas, no obstante usa la extensin .php para los archivos de esta carpeta porfavor. De manera alternativa, puedes usar la extensin .blade.php para habilitar el anlisis conla librera de plantillas Blade, que ser explicada en un captulo posterior./bundles.php [archivo]Para habilitar un bundle, simplemente adelo a la matriz en bundles.php. Tambin puedes usaruna pareja clave-valor nombre-matriz para definir opciones extra para el bundle./routes.php [archivo]El archivo routes contiene los mtodos que permiten que las rutas sean mapeadas a susrespectivas acciones con Laravel. Este tema ser tratado en profundidad en posteriores captulos.Este archivo tambin contiene declaraciones de varios eventos incluyendo pginas de errores, ypuede ser usado para definir creadores de vistas o filtros de rutas./start.php [archivo]El archivo start.php contiene las rutinas de inicializacin para el bundle /application bundle,como la auto-carga de directorios, carga de configuraciones, y otras cosas maravillosas! No dejesde echarle un vistazo a este archivo.En el prximo captulo, cubriremos el sistema de rutas usado por los controladores creando unpequeo sitio dinmico con varias pginas.

  • 3 Usando controladoresEn este captulo crearemos una sencilla web multi-pgina para mostrar el trabajo del sistema deenrutado de Laravel, sin profundizar en nada demasiado complicado.Como he mencionado en el anterior captulo, hay dos opciones disponibles para enrutar laspeticiones web en tu cdigo, Controladores y Rutas. En este captulo usaremos Controladores yaque cualquiera que se haya unido a nosotros desde otro framework, se sentir ms familiarizadocon ellos.

    3.1 Enrutando controladoresComencemos echndole un vistazo a un controlador:

    1

  • Usando controladores 9

    Crearemos nuestro controlador en la carpeta application/controllers como archivo enminsculas coincidiendo con el nombre del controlador. El Controlador de arriba debera serguardado en:

    1 /application/controllers/cuenta.php

    Antes de que podamos usar nuestro Controlador, tenemos que registrarlo en /application/routes.php.Vamos a aadir la siguiente lnea:

    1

  • Usando controladores 10

    1 Esta es la pgina del perfil.

    Por qu ocurre esto? La accin index es una accin especial que se llama cuando no hay ningunaaccin especificada en la URL, por tanto la pgina de arriba tambin podra ser invocada conla siguiente URL:

    1 /cuenta/index

    3.2 Pasando parmetrosEl enrutado simple es interesante, pero no nos ofrece nada que un simple sitio con PHP no pueda.Intentemos algo un poco ms dinmico. Aadiendo parmetros a las acciones de nuestroscontroladores, podemos pasar datos extra como segmentos a la URL. Vamos a aadir una accinde bienvenida a nuestro controlador:

    1

  • Usando controladores 11

    1 /application/views/bienvenida.php

    Con el siguiente contenido:

    1 Hola!2 Esta es la accin de bienvenida del controlador de cuenta.

    Ahora tenemos que devolver la vista desde nuestra accin de Bienvenida. Laravel tiene una formapreciosa y expresiva de hacerlo, vamos a verla:

    1

  • Usando controladores 12

    Usando el mtodo with() podemos pasar cualquier valor (u objeto) a la Vista, y darle unpseudnimo para que podamos usarlo en la vista. Hemos usado lo mismo para el nombre delparmetro y el pseudnimo, pero puedes llamarlos como quieras!Ahora usamos estos datos en nuestra vista:

    1 Hola!2 Bienvenido a , !

    Ahora nuestra accin funciona de la misma forma en que lo haca antes, solo que con mejorformato y un cdigo fuente ms bonito, separando toda la lgica de la capa visual.En vez de usar varios mtodos with(), puedes pasar una matriz como segundo parmetro amake() con parejas clave-valor. Esto puede ahorrarte algo de espacio consiguiendo el mismoresultado. He aqu un ejemplo:

    1

  • Usando controladores 13

    1

  • Usando controladores 14

    1

  • 4 Rutas con closuresEn este captulo usaremos Rutas con closures en vez de Controladores con acciones. Si aunno has leido el captulo anterior sobre el uso de controladores, te recomiendo que empieces ahya que partiremos de lo que ya hemos aprendido en ese captulo.Las rutas nos permitanmapear nuestras URLs del framework a closures, lo cual es una formamuylimpia de contener nuestra lgica sin toda la parafernalia de clase. Las closures son funcionesannimas (function() {}). Pueden ser asignadas y tratadas como cualquier otra variable. Params informacin sobre Closures, revisa el artculo del API de PHP.

    4.1 ClosuresVamos a echarle un vistazo a una ruta que enruta a una closure.

    1

  • Rutas con closures 16

    1

  • Rutas con closures 17

    1

  • Rutas con closures 18

    1

  • Rutas con closures 19

    La clave para la matriz puede ser tanto before para ejecutar el filtro antes de la ruta, o afterpara ejecutarlo despus. Se pueden aplicar mltiples filtros separando sus nombres con una |(tubera). Por ejemplo auth|csrf.Desde Laravel 3.1, si quieres aadir un filtro a un nmero de peticiones cuya URI coincida conun patrn especfico, usa la siguiente lnea:

    1

  • 5 Enlaces y URLsNuestra aplicacin puede volverse un poco aburrida si solo tenemos una nica pgina, y estoyseguro de que el usuario se enfadar rpidamente si tiene que andar escribiendo una URIcompleta para cambiar de pginas. Por suerte, los hiperenlaces estn aqu para salvarte el da.Si no has estado viviendo bajo una roca durante el ltimo par de dcadas, ya sabrs lo que son loshiper-enlaces, y no te aburrir con la explicacin tcnica. Antes de que podamos ver los enlaces,echemos un vistazo a cmo gestiona Laravel sus URLs.

    5.1 Obteniendo URLsPrimero, vamos a echarle un vistazo a un problema. Habrs observado que los frameworks tienenestructuras de URL realmente nicas, algunos tienen un index.php en ellos y otros no. Otrostendrn rutas complejas. En la mayora de los casos, usar una URL relativa como lo haras en otrositios te podra llevar a problemas graves a largo plazo. Si decides dar a todos URLs completas, ydecides mover la aplicacin ms tarde, puede que te encuentres abusando de la funcin de buscary reemplazar de tu editor favorito.Por qu no dejamos que Laravel haga todo el trabajo sucio? Laravel sabe la URL completa atu aplicacin, sabe cundo ests usando reescritura de URLs o no. Incluso sabe sobre tus rutas.Vamos a aprovecharnos de esa informacin usando la clase URL para generar algunas URLs delsitio.Comencemos buscando la URL a la raz de nuestra web. Podemos usar el mtodo base() paraello:

    1

  • Enlaces y URLs 21

    1

  • Enlaces y URLs 22

    1

  • Enlaces y URLs 23

    1 http://miproyecto/css/estilo.css

    Estos mtodos son realmente tiles, pero Laravel va un paso ms all y nos da unos helpersmscortos que quedan muy bien al usarlos en nuestras vistas. He aqu una lista de estos mtodoscortos, y sus alternativas ms largas.

    Helper Mtodourl() URL::to()asset() URL::to_asset()route() URL::to_route()action() URL::to_action()

    5.2 Generando enlacesAhora que podemos obtener los enlaces de nuestro sitio, el siguiente paso lgico sera usarlospara crear hiper-enlaces. S lo que ests pensando, puedo usar algo as:

    1

  • Enlaces y URLs 24

    1

  • 6 FormulariosLos formularios son una parte importante de cualquier aplicacin web. Ayudan a controlar elflujo de la aplicacin, nos premiten recibir datos de nuestros usuarios y hacer decisiones queafectan a la funcionalidad de nuestras aplicaciones. Tambin es lo que ms odio en el mundoescribir.Afortunadamente para mi, la clase de formularios de Laravel se encarga de gran parte del trabajoduro dndonos tiles mtodos para generar elementos comunes de un formulario. Vamos a usarla clase formulario para crear un simple formulario web en una de nuestras vistas.

    6.1 Creando formularios1 // form.php2 34 5 6 78 9 10 1112 13

    Para un momento, echa un vistazo al cdigo fuente del formulario porque no habrs visto nuncanada tan limpio. Dilo alto para ti mismo, vamos. Esperar.

    Nunca he visto un formulario tan limpio.

    Ests en lo cierto, es hermoso. Echemos un vistazo al cdigo generado para asegurarme de queno te estoy enseando mal, ya sabes para divertirnos?

    25

  • Formularios 26

    1 23 4 Usuario5 67 8 Contrasea9 1011 12 1314

    Genial, funcion! Quiero decir, por supuesto que lo hizo! Vamos a verlo lnea a lnea para vercmo funciona. En nuestra primera lnea tenemos el mtodo Form::open(), que crea una etiquetade apertura de formulario para nosotros.

    1

    El primer parmetro al mtodo es la URI a la que queremos enviar el formulario. El segundoparmetro es el METHOD usado para enviar el formulario. Si no facilitas uno como cadena, Laravelsume que quieres un formulario POST, que es lo ms comn.El tercer parmetro tambin es opcional, puedes pasar una matriz de parejas atributo => valorpara aadir atributos extra a la etiqueta . Por ejemplo, si quisieras seleccionar el formulariocon JavaScript, querras pasar array('id' => 'miformulario') como tercer parmetro para daral elemento una id.Para enviar un formulario a una URI segura (https) necesitars usar el mtodo open_secure()en vez de open(). Acepta los mismos parmetros.Si quieres poder enviar ficheros a travs de tu formulario, tendrs que usar multipart/data,usa open_for_files() en vez del mtodo open(). Este mtodo tambin acepta los mismosparmetros.Finalmente, si quieres enviar un formulario a una URI segura y subir ficheros, tendrs que usarel mtodo open_secure_for_files() que, una vez ms, acepta los mismos parmetros y es unacombinacin de open_secure() y open_for_files().

    6.2 Aadiendo etiquetasLa siguiente lnea contiene el mtodo Form::label() que es usado para crear un elemento. El primer parmetro es el name del elemento input que ser usado para el atributofor="". El segundo parmetro ser usado como contenido del elemento label. Puedes pasar unamatriz como tercer parmetro opcional, para aplicar atributos HTML adicionales.

  • Formularios 27

    6.3 Generando camposDespus, tenemos los generadores de campos. Estos mtodos ayudan a generar todos loselementos HTMLs que son comunes en los formularios. En el ejemplo anterior usamos losmtodos text() y password() para generar los elementos

  • Formularios 28

    1 2 Usuario3 Miembro4 Editor5 Administrador6

    Genial! Ahora es momento de enviar nuestro formulario.

    6.4 Generando botonesLos mtodos generadores submit() y button(), aceptan ambos los mismos parmtros. Siendo elprimero el value del elemento HTML y el segundo la matriz abitual de atributos.

    1

  • Formularios 29

    1

  • 7 Gestionando la entrada de datosAhora que ya sabemos cmo crear formularios, tenemos que aprender cmo gestionar los datosque nos envan a travs de ellos. Como siempre, Laravel nos facilita una forma ultra-limpiade manejar esos datos. No hace falta interactuar con matrices de PHP como $_POST, $_GET ni$_FILES. Seamos sinceros, eran horribles.

    7.1 Datos de peticionesUsemos la clase Input para hacernos cargo de esto:

    1

  • Gestionando la entrada de datos 31

    1

  • Gestionando la entrada de datos 32

    1

  • Gestionando la entrada de datos 33

    1

  • 8 ValidacinLa validacin es una parte importante de muchas aplicaciones web. Nunca puedes fiarte de tususuarios, llevan tramando tu destruccin semanas abusando de tus formularios con JavaScriptmalicioso.No podemos dejarles ganar, no deben destruir nuestras preciosas aplicaicones. Validemos todoslos datos facilitados por los usuarios, de esa manera no podrn hacernos nada de dao.Naturalmente, Laravel tiene una librera, con el acertado nombre de Validation que har todoel trabajo duro por nosotros.

    8.1 Estableciendo una validacinComencemos creando un formulario imaginario, cierra tus ojos e imagina un largo y bonitoformulario con muchos campos ohh ohh puedes volver a abrir los ojos?Bien, asumir que te cansaste de esperar, abriste los ojos y ests de vuelta conmigo y nuestroformulario imaginario. Vamos a obtener los datos de ese formulario.

    1

  • Validacin 35

    1

  • Validacin 36

    1

  • Validacin 37

    1

  • Validacin 38

    not_in:rosa,moradoSe asegura de que ninguno de los valores coincide con el facilitado.confirmedEl valor del campo debe equivaler a un campo de confirmacin, nombrado con el formato acceptedEl valor debe ser igual a yes o 1. til para validar casillas de verificacin.same:edadEl campo debe ser igual al campo especificado en la misma regla.different:edadEl campo no debe coincidir con el campo especificado en la misma regla.match:/[a-z]+/El campo debe coincidir con la expresin regular facilitada.unique:usuariosEste es uno de mis favoritos. El validador buscar en la tabla de la base de datos users y seasegurar de que el valor es nico en la columna que tiene el mismo nombre. til para asegurartede que no existan los nombres de usuario o correos duplicados.Si quieres espeficicar un nombre de columna, simplemente psalo como segundo parmetro:

    1 unique:usuarios,apodo

    Tambin puedes forzar la regla para que ignore un determinado id pasndolo como tercerparmetro.

    1 unique:usuarios,apodo,5

    exists:coloresActa al contrario que unique. El valor debe existir en la tabla de la base de datos. De nuevo,puedes pasar un segundo parmetro para referirte a otra columna.before:1984-12-12La fecha facilitada por el campo, debe haber ocurrido antes de la plantilla facilitada a la reglabefore.Los filtros before y after usan strtotime() para calcular una marca de tiempo para lacomparacin. Lo cual implica que puedes usar ciertos trucos como:

    1 before:next Thursday

  • Validacin 39

    Por desgracia, yo fui el que aadi esta funcionalidad por lo que si se rompe puedes venir agritarme lo siento!after:1984-12-12Similar a before, solo que la fecha debe haber ocurrido despus de la fecha facilitada a la reglaafter.emailEl valor debe ser una direccin de correo vlida.urlEl valor debe coincidir con el formato de una URL.active_urlEl valor debe coincidir con una URL vlida y activa. Se usar checkdnsr para verificar que laURL est activa.mimes:png,mp3El valor debe ser un archivo en $_FILE cuyo tipo MIME coincide con las extensiones de archivofacilitadas. Puedes aadir tipos de MIME adicionales a la matriz en config/mimes.php.imageEl archivo subido debe ser una imagen.

    8.4 Mensajes de error personalizadosPara mi gusto, los mensajes de error son bastante descriptivos, pero tus clientes pueden tener suspropias ideas, o puede que necesites traducirlos. Veamso cmo podemos personalizar nuestrosmensajes de error para ajustarlos a nuestras necesidades.Puedes editar los mensajes de errores de validacin modificando el archivo directamente enapplication/language/en/validation.php

    1 ...2 "after" => "The :attribute must be a date after :date.",3 "alpha" => "The :attribute may only contain letters.",4 "alpha_dash" => "The :attribute may only contain letters, numbers, and \5 dashes.",6 ...

    Laravel reemplaza el marcador :attribute con el nombre del campo. Existen otros marcadoresen las reglas aunque su propsito es bastante comprensible a simple vista.Si prefieres cambiar los mensajes para un nico formulario, en vez de editarlos globalmente,puedes pasar una tercera matriz de mensajes al mtodo Validator::make().

  • Validacin 40

    1

  • Validacin 41

    1

  • 9 MigracionesInciialmente, intent incluir una gua al constructor de consultas Fluent en este captulo, pero creoque el captulo se volvi demasiado largo por lo que decid cubrir nicamente la configuracin dela base de datos y las migraciones en este captulo. Preprate para una buena y larga explicacinsobre Fluent en el prximo captulo.Las migraciones son una de las caractersticas que ms me gustan de Laravel. Odio escribir SQLy la clase Schemame permite crear mis tablas de forma sencilla, sin escribir una sola lnea de eserepugnante lenguaje! Y no solo eso, el cdigo de Schema es precioso y se lee como un libro.Si no te has encontrado con las migraciones antes, son una forma de describir cambios a tubase de datos, en archivos, para que los diferentes entornos/instalaciones de tu aplicacin estnal tanto del esquema actual. Los cambios al esquema tambin pueden ser revertidos o hacerlesmarcha atrs. Las migraciones tambin pueden ser usadas para rellenar datos en tablas condatos de ejemplos.

    9.1 Configuracin de la base de datosDirgete al archivo de configuracin application/config/database.php. Si alguna vez hasinstalado una aplicacin PHP, estars familiarizado con este tipo de archivos. Tienes tus datosde acceso a la base de datos a mano, verdad? Si no, ve a buscarlos ahora mismo!Ya has vuelto? Genial, vamos a empezar a profundizar.Desplzate hasta la clave connections de la matriz, donde vers un nmero de opciones paraunos pocos de tipos de bases de datos. Rellena los parmetros de conexin para la base de datosde tu eleccin. Yo voy a empezar con la tpica base de datos de MySQL.

    1

  • Migraciones 43

    1

  • Migraciones 44

    11 {12 //13 }1415 /**16 * Revert the changes to the database.17 *18 * @return void19 */20 public function down()21 {22 //23 }2425 }

    Como puedes ver, nuestra clase de migracin consiste en dos mtodos, up() es responsable dehacer todos los cambios a la base de datos, mientras que down() hace exactamente lo contrario.De esta forma, una migracin puede ser realizada y hacerle marcha atrs cuando sea necesario.Si fueras a crear una tabla con el mtodo up(), usaramos DROP en la misma tabla en el mtododown().Entonces, cmo hacemos cambios en nuestra base de datos? Sin duda con alguna complejaconsulta SQL, verdad? Jaja, no. Estamos usando Laravel, si es feo, no est en el framework.Echemos un vistazo a cmo crear una tabla con la clase Schema de Laravel.

    1

  • Migraciones 45

    Llamamos al mtodo create() en la clase Schema para crear una nueva tabla, como parmetropasamos el nombre de la tabla que vamos a crear, y una closure como segundo parmetro.Tambin necesitamos pasar un parmetro a la closure, puedes llamarlo como quieras, pero megusta usar $tabla porque creo que hace que el cdigo se lea mejor.Dentro de la closure, podemos usar el parmetro $tabla para crear nuestros campos con un buennmero de mtodos bien nombrados. Echmosles un vistazo.increments()Aade un ID autoincremental a la tabla. La mayora de tus tablas lo tendrn!string()Crea un campo VARCHAR. string suena mejor, verdad?integer()Aade un campo del tipo entero a la tabla.float()Aade un campo del tipo float a la tabla.boolean()Aade un campo del tipo booleano a la tabla.date()Aade un campo de tipo fecha a la tabla.timestamp()Aade un campo de tipo timestamp a la tabla.timestamps()Aade los campos created_at y updated_at a la tabla para indicar cando se cre y actualiz(respectivamente) el registro.text()Aade un campo de tipo texto a la tabla.blob()Aade un campo de datos blob a la tabla.Tambin puedes usar el mtodo encadenable ->nullable(), para permitir que el campo recibavalores del tipo NULL.Los detalles completos sobre los parmetros disponibles para los mtodos arriba detallados,podis encontrarlos en la documentacin oficial.Genial, ahora hemos creado nuestra tabla! Teniendo en cuenta que hemos creado la tabla en elmtodo up(), ahora tenemos que hacer DROP a la tabla en el mtodo down(), para que el esquemavuelva a su estado original en caso demarcha atrs. Por fortuna, la clase Schema tiene otromtodoque es perfecto para esta tarea.

    http://laravel.com/docs/database/migrations

  • Migraciones 46

    1

  • 10 Fluent Query BuilderFluent es otra genial librera que Laravel facilita para ayudarme a esquivar la bala del SQL.Aunque aun puedes escribir consultas SQL a pelo si te gusta el dolor. Que qu es lomejor de usar Fluent? Aparte de la falta de SQL, es que usa sentencias preparadas, que estncompletamente protegidas contra ataques de inyeccin SQL. Fluent es tambin bueno, fluido,en varios dialectos SQL por lo que tus mtodos funcionarn en una variedad de bases de datos.Antes de que empecemos tendrs que entender el concepto de encadenado. Echa un ojo a esteejemplo.

    1

  • Fluent Query Builder 48

    1

  • Fluent Query Builder 49

    1

  • Fluent Query Builder 50

    1 SELECT * FROM usuarios WHERE usuario = 'dayle' OR cara LIKE '%modelomasculi\2 no%';

    Ahora no necesito explicar cmo funciona cada caracterstica de SQL. Hay multitud de librospara ello, pero voy a nombrar los mtodos usados para cumplir tareas comunes:Usa los mtodos where_in(), where_not_in(), or_where_in() y or_where_not_in() paracomparar un campo con una matriz de elementos.Los mtodos where_null(), where_not_null(), or_where_null(), y or_where_not_null() paracomparar un campo con un valor NULL.A veces querrs anidar clusulas where entre s. Laravel provee funcionalidad para esto en formade Clusulas Where anidadas. Vamos a ver un cdigo de ejemplo de la documentacin oficial:

    1

  • Fluent Query Builder 51

    1

  • Fluent Query Builder 52

    1

  • Fluent Query Builder 53

    1

  • Fluent Query Builder 54

    1

  • Fluent Query Builder 55

    1

  • 11 ORM EloquentUn ORM es un paquete realmente til. Son las siglas para Mapeo objeto-relacional (ObjectRelational Mapper). Suena muy complicado, verdad? Vayamos por partes. La parte de mapeo,es porque estamos mapeando nuestros objetos PHP o clases a tablas y filas de la base da datos.La parte Relacioinal quedar ms clara en la seccin de relaciones.Hay muchas soluciones de ORM, pero ninguna tan elocuente como bueno, Eloquent. Eloquentviene con Laravel y puede ser usado sin modificar nada. Para esta parte, voy a asumir queconfiguraste tu base da datos, como describimos en el captulo de Migraciones, y que estsfamiliarizado con los mtodos y encadenado del captulo de Fluent Query Builder. Vamos abasarnos en ellos.Vers que Eloquent es una alternativa a usar Fluent, pero comparte mucho de sus mtodos. Lanica diferencia es que vamos a interactuar con modelos de Eloquent, pero comparten muchosde los mtodos, en vez de los stdObject que obtenemos de Fluent. Va a hacer que nuestrocdigo parezca incluso ms claro. Vamos a sumergirnos directamente y revisemos el modelode Eloquent.

    11.1 Creando y usando modelos de Eloquent1

  • ORM Eloquent 57

    1

  • ORM Eloquent 58

    1

  • ORM Eloquent 59

    1

  • ORM Eloquent 60

    1

  • ORM Eloquent 61

    1

  • ORM Eloquent 62

    1

  • ORM Eloquent 63

    1

  • ORM Eloquent 64

    11.3 Insertando modelos relacionadosCuando estamos insertando modelos relacionados, podemos establecer las claves forneasusuario_id o sombrero_id nosotros mismos, pero no es demasiado bonito. Por qu no lepasamos el objeto?:1

  • ORM Eloquent 65

    1

  • ORM Eloquent 66

    1

  • ORM Eloquent 67

    1

  • ORM Eloquent 68

    1

  • 12 EventosLos eventos son una forma de permitir a otras porciones de cdigo extender tus aplicaciones deforma elegante. Algunas aplicaciones se refieren a este tipo de extensiones como Hook. Si eresun Gur PHP puede que encuentres parecido al patrn de diseo de Observador / Observable.Los eventos pueden tener cualquier nmero de escuchadores, y ejecutarlos puede devolver unvariado nmero de respuestas. Creo que la mejor forma de aprender ser verlo en accin. Vamosa ver con ms detalle los Eventos en Laravel.

    12.1 Activa un evento1

  • Eventos 70

    12.2 Escucha un EventoPara escuchar un evento, usamos probablemente lo hayas adivinado. El mtodo listen(). Ledamos el nombre del evento que estamos buscando como cadena y una closure que se ejecutecuando el evento haya sido activado. El resultado de la closure ser pasado de vuelta comorespuesta. Echemos un vistazo..

    1

  • Eventos 71

    1

  • Eventos 72

    1

  • 13 Plantillas BladeEl motor de plantillas de Laravel, Blade, te permite usar una bonita sintaxis para incluir cdigoPHP en tus vistas. Tambin incluye un nmero de atajos que permiten el usao de caractersticasexistentes de Laravel. Las plantillas Blade son cacheadas por defecto, lo cual las hace muyrpidas!Como siempre, vamos al lo!

    13.1 Lo bsicoPara activar las plantillas de Blade, tendrs que nombrar tus vistas con la extensin .blade.phpen vez de .php. Tan sencillo como eso!Cuando usamos los archivos de vista en los frameworks PHP, a menudo te encontrars haciendoesto

    1

    Activando las etiquetas cortas de PHP podemos recortarlo un poco

    1

    no obstante aun podemos mejorar. Echemos un vistazo a cmo podramos hacerlo con Blade.

    1 {{ $val }}

    Precioso! El espacio entre las llaves es opcional, pero creo que se ve mejor con el espacio. Elcontenido de las dobles llaves es evaluado y volcado. Puedes usar cualquier PHP que quierasdentro. Por ejemplo

    1 {{ 5 * time() }}

    Este cdigo funcionar tambin. Todo lo que hace Laravel es convertir {{ $val }} a . Asegrate de considerar esto si te metes en problemas con Blade!

    13.2 LgicaQu pasa con los bucles foreach()?, uso montones de ellos! Tambin uso muchos if y else.Blade simplifica todas estas sentencias condicionales con el uso del mgico signo @. Echemos unvistazo.

    73

  • Plantillas Blade 74

    1 .Lo que nos queda es

    1 @if ($usuario->nombre == 'Dave')2 Bienvenido Dave!3 @else4 Bienvenido invitado!5 @endif

    Muy simple. He aqu otros operadores que puedes usar con Blade. Deben serte familiares.

    1

  • Plantillas Blade 75

    1 2 3 4 5 @yield('titulo')6 7 8 9 10 @section('navegacion')11 Inicio12 Blog13 @yield_section14 15 1617 @yield('contenido')1819 20

    Nuestra plantilla principal usa el mtodo @yield() para definir una regin de contenido quepuede ser rellenada con una vista que use esta plantilla. Simplemente pasa una cadena al mtodopara facilitar un apodo para esa regin de contenido que ser usada para identificarla ms tarde.@section() y @yield_section definen una regin de contenido que contienen datos por defectopero que pueden ser reemplazados posteriormente. Echemos un ojo a una vista (page.blade.php)que hace uso de la plantilla que acabamos de crear.

    1 @layout('template')23 @section('titulo')4 Pgina de Dayle!5 @endsection67 @section('navegacion')8 @parent9 Sobre mi10 @endsection1112 @section('contenido')13 Bienvenido!14 Bienvenido a la pgina de Dayle!15 @endsection

    En esta vista usamos el mtodo @layout() para especificar que queremos usar una vista llamadatemplate como plantilla. Ahora podemos usar @section() y @endsection para reemplazar el

  • Plantillas Blade 76

    contenido de regiones de contenido, con el cdigo que se encuentre entre ambos mtodos.En el caso de la seccin de navegacion, descubrirs que hay una etiqueta @parent dentro delarea de contenido. Blade la reemplazar con el contenido de la plantilla bsica.Si devolvemos..

    1 return View::make('page');

    Desde nuestra ruta/accin, ahora podemos ver nuestra pgina dentro de la plantilla layout. Algocomo esto

    1 2 3 4 5 Pgina de Dayle!6 7 8 9 10 Inicio11 Blog12 Sobre mi13 14 1516 Bienvenido!17 Bienvenido a la pgina web de Dayle!1819 20

    Genial! Tambin podemos usar cuantas plantillas como queramos. Son vistas normales de Blade!Qu pasa si queremos facilitar contenidos a una @section desde nuestra Ruta/Accin? Sim-plemente llama al mtodo Section::inject() con el nombre de la seccin, y una cadenarepresentando el contenido de la seccin para que sea inyectado en la vista.

    1 Route::get('/', array('do' => function()2 {3 Section::inject('title', 'Mi sitio');45 return View::make('page');6 }));

    Y eso es todo! Ahora puedes usar Blade para hacer que tus vistas se vean realmente limpias yeficientes. Tu diseador te amar por ello.

  • 14 AutentificacinMuchas aplicaciones querrn una capa de autentificacin. Si ests escribiendo un blog, no querrsque tus lectores puedan publicar nuevos artculos. O si ests trabajando con datos sensibles, noquerrs que los usuarios sin autorizacin tengan acceso a estos.Por suerte, Laravel tiene una clase de autentificacin simple, segura y altamente personalizable.Vamos a echar un ojo a cmo podemos interactuar con ella.

    14.1 ConfiguracinAntes de que empecemos, tendrs que crear una nueva tabla para guardar los detalles denuestros usuarios. Podemos nombrar esta tabla como queramos, pero si la nombramos usersno tendremos que cambiar el archivo de configuracin. He aqu como crear una tabla adecuadacon el constructor de esquema.

    1

  • Autentificacin 78

    1

  • Autentificacin 79

    1

  • Autentificacin 80

    1

  • Autentificacin 81

    1

  • Autentificacin 82

    1

  • Autentificacin 83

    iniciado sesin. Eso es por lo que cre el filtro auth, que est incluido en Laravel como estndar.Echemos un vistazo al filtro en s que puedes encontrarlo en routes.php.

    1

  • Autentificacin 84

    1

  • Autentificacin 85

    1

  • 15 El tutorial del BlogFinalmente ha llegado el momento de escribir nuestra primera aplicacin completa. Si no hasledo los otros captulos, puede que encuentres esto un poco difcil. Vamos a ver lo que vamos ausar para crear el blog.

    Rutas Migraciones Eloquent Plantillas de Blade Autentificacin Filtros

    Veamos el plan y organicemos lo que vamos a crear.

    15.1 El diseoVamos a crear un blog de tres pginas. La primera pgina consistir en un listado de posts, similara la primera pgina de un blog de Wordpre Wordpush. La siguiente pgina ser la pgina avista-completa a la que llegas haciendo click a un artculo que quieres leer. La pgina final esaquella en la que escribimos nuestros artculos. Normalmente, tendras la habilidad de editar oborrar artculos, pero podemos aadir todo eso ms tarde. No estoy contando la pgina habitualde login, ya que es usada en cualquier aplicacin que implemente autentificacin.Pensemos en el esquema de la base de datos un momento. Sabemos que vamos a necesitar unatabla para almacenar nuestros artculos. Tambin tendremos una tabla para almacenar nuestrosusuarios, y vamos a necesitar alguna forma de relacin entre ambos. Vamos a pensar en loscampos:Tabla : posts

    Campo Tipoid INTEGERtitle VARCHAR(128)body TEXTauthor_id INTEGERcreated_at DATETIMEupdated_at DATETIME

    Tabla : users

    Campo Tipoid INTEGERusername VARCHAR(128)nickname VARCHAR(128)

    86

  • El tutorial del Blog 87

    password VARCHAR(64)created_at DATETIMEupdated_at DATETIME

    Pinta bien. Podemos usar el campo author_id en el objeto Post para hacer referencia al objetoUserque representa el autor de un artculo.Bien, a trabajar!

    15.2 Configuracin bsicaAntes que nada, tendrs que configurar tu base de datos y el driver de sesin. Deberas saberhacerlo en este punto del libro. Usar MySQL como base de datos como siempre.Ahora creemos migraciones para nuestras tablas usando Artisan como hicimos en el captulo demigraciones.

    1 php artisan migrate:make create_users

    Nuestro esquema para up()con la cuenta de usuario por defecto:

    1

  • El tutorial del Blog 88

    1 php artisan migrate:make create_posts

    El esquema para up():

    1

  • El tutorial del Blog 89

    1

  • El tutorial del Blog 90

    19 Route::get('login', function() {20 // Muestra el formulario de login21 });2223 Route::post('login', function() {24 // Gestiona el formulario de login25 });2627 Route::get('logout', function() {28 // Cierra la sesin en el sistema29 });

    Bien, ya las tenemos. Como puedes ver estoy usando GET/POST para mostrar y gestionarformularios con la misma URI.

    15.5 VistasComencemos creando una nueva distribucin de Blade como base para nuestra aplicacin.templates/main.blade.php

    1 2 3 4 5 Wordpush6 {{ HTML::style('css/style.css') }}7 8 9 10 Wordpush11 Code is Limmericks12 1314 15 @yield('content')16 17 18

    Como puedes ver, tenemos una plantilla muy sencilla en HTML5, con una hoja de estilos CSS(que no vamos a cubrir, ya que sirve para hacer tu blog bonito, pero este no es un libro de diseo)y un rea de contenido para el contenido de nuestra pgina.Vamos a necesitar un formulario de login, para que los autores de nuestros artculos puedancrear nuevas entradas. Voy a robar esta vista del tutorial anterior y personalizarla un poco con la

  • El tutorial del Blog 91

    distribucin de blade. De hecho esta es una buena prctica, re-usa todo lo que puedas y te harscon tu propio kit de desarrollo de Laravel.pages/login.blade.php

    1 @layout('templates.main')23 @section('content')4 {{ Form::open('login') }}56 7 @if (Session::has('login_errors'))8 Username or password incorrect.9 @endif1011 12 {{ Form::label('username', 'Username') }}13 {{ Form::text('username') }}1415 16 {{ Form::label('password', 'Password') }}17 {{ Form::password('password') }}1819 20 {{ Form::submit('Login') }}2122 {{ Form::close() }}23 @endsection

    Como puedes ver, nuestro formulario de login est usando nuestra distribucin recin creada.Vamos a crear el formulario de Crear nuevo artculo.pages/new.blade.php

    1

  • El tutorial del Blog 92

    14 {{ Form::label('body', 'Body') }}15 {{ $errors->first('body', ':message') }}16 {{ Form::textarea('body', Input::old('body')) }}1718 19 {{ Form::submit('Create') }}2021 {{ Form::close() }}22 @endsection

    15.6 A programarFinalmente ha llegado la hora de ponernos manos a la obra. Comencemos con la rutina deautentificacin. Primero tenemos que enlazar nuestra ruta de login a la vista con el formulario.

    1

  • El tutorial del Blog 93

    Vamos a crear la ruta de cierre de sesin para que podamos probar el proceso de inicio de sesinal completo.

    1

  • El tutorial del Blog 94

    1

  • El tutorial del Blog 95

    16 'title' => 'required|min:3|max:128',17 'body' => 'required'18 );1920 // Hagamos la validacin21 $v = Validator::make($new_post, $rules);2223 if ( $v->fails() )24 {25 // redirigimos al formulario con los errores26 // entrada de datos y el usuario que27 // ha iniciado sesin actualmente28 return Redirect::to('admin')29 ->with('user', Auth::user())30 ->with_errors($v)31 ->with_input();32 }3334 // Crea el nuevo artculo35 $post = new Post($new_post);36 $post->save();3738 // Redirigimos a la vista de nuestro artculo39 return Redirect::to('view/'.$post->id);4041 });

    Ahora deberamos poder crear algunos artculos en el blog. nimo! Escribe algunos artculospara que tengamos algo que ver en nuestra vista de lista de todos los artculos.Hablando de eso, vamos a trabajar sobre esa vista.

    1

  • El tutorial del Blog 96

    1

  • El tutorial del Blog 97

    Editar / Borrar artculosAadir la funcionalidad de editar o eliminar artculos no sera demasiado trabajo, y nos permitiraque se realizara mantenimiento en el blog.

    Slugs de la URLPodramos crear slugs de las URLs de los artculos para usarlas en vez de las ids en nuestrasURLs lo cual nos dejara una mejor optimizacin para buscadores.

  • 16 Pruebas unitariasLas pruebas unitarias pueden ser muy tiles para un desarrollador web. Se pueden usar pararevisar si aadir una nueva caracterstica o modificar el cdigo base de alguna forma, haalterado de manera accidental alguna otra caracterstica, provocando que esta falle. Algunosdesarrolladores incluso practican un desarrollo orientado a las Pruebas, donde las pruebas sonescritas antes que el cdigo para asegurar que el cdigo escrito cumple con todos los requisitos.Laravel nos ofrece el directorio tests para albergar todas las pruebas de tu aplicacin e inclusoaade un comando de ayuda a la interfaz de Artisan para ejecutar pruebas de PHPUnit.No solo podemos probar la aplicacin sino que los bundles tambin pueden contener sus propiaspruebas. De hecho, Laravel tiene un bundle dedicado a las pruebas de caractersticas del ncleodel frameowrk. Puede ser encontrado en el repositorio de pruebas de Github de Laravel.

    16.1 InstalacinNo, no vamos a cubrir nuevamente la instalacin de Laravel!Laravel usa el software PHPUnit para ejecutar sus pruebas. Antes de poder usar las caractersticasde pruebas unitarias de Laravel, tendremos que instalar este software.La instalacin de PHPUnit puede variar entre distintos sistemas operativos, por lo que creoque sera mejor mirar la documentacin oficial de PHPUnit para encontrar las instruccionesde instalacin apropiadas. Puedes encontrar la pgina de instalacin aqu.

    16.2 Creando una pruebaEchemos un vistazo a un caso de prueba. Por suerte, Laravel ha incluido un caso de ejemplopara nosotros!

    1

  • Pruebas unitarias 99

    13 {14 $this->assertTrue(true);15 }1617 }

    Como puedes ver, creamos nuestros casos de prueba en un archivo con la extensin test.php, elnombre de la clase debe comenzar con la palabra clave Test y debe extender la clase PHPUnit_-Framework_TestCase. Estas limitaciones no estn impuestas por Laravel si no por PHPUnit.Una prueba de PHPUnit puede contener cualquier nmero de prueba, como acciones camelcase,con la palabra test como prefijo. Nuestras pruebas pueden contener un distinto nmero deaserciones que deciden si nuestras pruebas pasan o fallan.Puedes encontrar una lista completa de aserciones en la documentacin de PHPUnit.

    16.3 Ejecutando pruebasLas pruebas pueden ser ejecutadas usando la interfaz de lnea de comandos Artisan. Simplementeusa el comando test para ejecutar todas las pruebas.

    1 php artisan test

    y el resultado

    1 PHPUnit 3.6.10 by Sebastian Bergmann.23 Configuration read from /home/daylerees/www/laravel/develop/phpunit.xml45 .67 Time: 0 seconds, Memory: 6.25Mb89 OK (1 test, 1 assertion)

    Con la parte OK en verde, estamos seguros de que todas las pruebas han tenido xito.Por supuesto sabamos que la prueba tendra xito porque estamos usando elmtodo assertTrue()para revisar el valor true. No hay forma de que eso pudiera fallar.Vamos a fastidiar la prueba para que falle. Vamos a cambiar el parmetro a false.

    http://www.phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.assertions

  • Pruebas unitarias 100

    1 ...2 $this->assertTrue(false);3 ...

    y el resultados:

    1 PHPUnit 3.6.10 by Sebastian Bergmann.23 Configuration read from /home/daylerees/www/laravel/develop/phpunit.xml45 F67 Time: 0 seconds, Memory: 6.50Mb89 There was 1 failure:1011 1) TestExample::testSomethingIsTrue12 Failed asserting that false is true.1314 /home/daylerees/www/laravel/develop/application/tests/example.test.php:1215 /usr/bin/phpunit:461617 FAILURES!18 Tests: 1, Assertions: 1, Failures: 1.

    Ahora tenemos lneas brillantes en rojo para indicar que las pruebas han fallado incluyendoalgunos detalles de porqu las pruebas han fallado.Si quisiramos probar un bundle, simplemente pasaramos un parmetro al comando test. Porejemplo:

    1 php artisan test mybundle

    16.4 Probando el ncleoEl nucleo de Laravel est bien probado unitariamente pero si quieres ejecutar las pruebas por timismo, aqu tienes cmo hacerlo.

    Instala el bundle de pruebasDescarga el bundle tests desde github y extrelo en el directorio bundles/laravel-tests. Ousa php artisan bundle:install laravel-tests para cumplir el mismo objetivo.Ahora simplemente ejecuta el comando test:core para ejecutar las pruebas del ncleo delpaquete.

    https://github.com/laravel/tests

  • Pruebas unitarias 101

    1 php artisan test:core

  • 17 CachLaravel ofrece una clase muy simple para usar la Cach, permitindote cachear todo lo quenecesites durante tanto tiempo como necesites. Confuso? Echmosle un vistazo en accin.

    17.1 ConfiguracinHaymuchas formas de almacenar tus datos cacheados pero debes establecer un driver que elija elmtodo que quieres usar en application/config/cache.php. Las opciones son file, memcached,apc, redis y database. Puede que obtengas mejor rendimiento con apc o memcached pero voy ausar la cach basada en file por la simplicidad de su configuracin.

    1

  • Cach 103

    1

  • 18 Autocarga de clasesCon muchos frameworks, saber dnde poner tus archivos y cmo cargar definiciones de clasespuede ser un tema complicado. Sin embargo, con Laravel no hay reglas estrictas que se apliquena la estructura de tu aplicacin. El auto loader de Laravel es una librera inteligente que simplificala carga de clases con convenciones de nombrado de subcarpetas. Es lo suficientemente flexiblepara gestionar la adicin de libreras o paquetes complejos con facilidad. Echemos un vistazo alas funciones que tenemos disponible.

    18.1 AsociacinLa asociacin es el mtodo ms simple de cargar clases. Puedes pasar al auto loader una matrizde nombres de clases con ubicaciones de archivos en forma de parejas clave-valor y Laravel seencargar del resto. El eficiente autoloader solo cargar la clase requerida cuando se use la clase.Por defecto, las asociaciones del Autoader se establecen en el archivo start.php. Sin embargopuedes usar la clase desde cualquier parte, pero el archivo start.php es una buena eleccindebido a que se carga muy pronto. Echemos un vistazo a la asociacin:

    1

  • Autocarga de clases 105

    El auto loader de Laravel detectar (mtodos mgicos de php) que hace falta cargar unadefinicin de clase. Mirar el mapeo de definiciones para ver si existe ah nuestra clase yproceder a hacer el apropiado include() de la clase.

    18.2 Carga de directoriosSi tienes un nmero de clases que siguen el patrn de tener el nombre del archivo igual al nombrede la clase en minscula, puede que quieras especificar el directorio en vez de cada archivo deforma individual. Puedes hacerlo usando el mtodo directories() de la clase Autoloader. Sinembargo, esta vez tendrs que facilitar una matriz de valores como ubicaciones y nombres dearchivos. Por ejemplo:

    1

  • Autocarga de clases 106

    1

  • 19 ConfiguracinLaravel tiene muchos archivos de configuracin en application/config para configurar casitodas las caractersticas que ofrece el framework. No sera genial si t pidieras crear tus propiosarchivos de configuracin de la misma forma? Bueno, hoy es tu da de suerte, porque puedes!

    19.1 Creando nuevos archivos de configuracinLos archivos de configuracin son simplemente archivos PHP que se encuentran en application/configo en un subdirectorio, y devuelven una matriz PHP. Por ejemplo:

    1

  • Configuracin 108

    Estoy seguro de que puedes hacer una descripcin mejor. Te habrs dado cuenta de que losarchivos de configuracin de Laravel estn en parejas de clave-valor. El ndice representa laclave, y el valor su valor.El valor del ajuste puede ser cualquier valor u objeto que PHP soporte. Incluso puede ser unaclosure. Facilitando una closure puedes hacer fcil al usuario cambiar la configuracin haciendoque se cargue desde otra fuente. Por ejemplo:

    1

  • Configuracin 109

    1

  • 20 El contenedor IoCEl contenedor IoC es un tema complicado. Mucha gente est confundida por su descripcinen la documentacin y por un corto perodo de tiempo, yo estaba entre esa gente. Tras muchainvestigacin y el apoyo de la fantstica comunidad de Laravel (nete a nosotros en #laravel enel IRC de freenode) he conseguido aclarar el tema con xito. Espero poder arrojar algo de luzsobre este misterioso tema.IoC son las siglas para Inversin de Control. No quiero complicar las cosas con una descripcincompleta. Hay demasiados artculos en la red que cubrirn el lado ms complicado de este tema.En vez de eso, piensa en el contenedor como Invertir el Control o Devolver el control a Laravelpara resolver nuestros objetos.Esto es de lo que trata el contenedor, de resolver objetos. Aparte de su uso para inyectardependencias para usarlos en pruebas unitarias, puedes hacerte a la idea de que el ContenedorIoC es un atajo para resolver objetos complejos o seguir un patrn singleton sin la habitualclase asociada al patrn. Hablaremos ms de singleton ms tarde. Echemos un vistazo a cmoregistrar objetos en el contenedor.

    20.1 Registrando objetosUsemos nuestra imaginacin. Como el gran dinosaurio morado nos ense en la tele. Vamos aimaginarnos una clase llamada Luzambiental que ser usada por toda nuestra aplicacin paraalgn oscur luminoso propsito.Por desgracia, nuestra clase de Luzambiental necesita mucha configuracin antes de poderusarla. Echmosle un vistazo.

    1

  • El contenedor IoC 111

    1

  • El contenedor IoC 112

    20.3 SingletonsResolver nuestra LuzAmbiental es til, pero ?qu ocurre si instanciar LuzAmbiental es realmentecostoso en recursos o solo debera ser instanciada una vez? El mtodo register no ser tilen este caso teniendo en cuenta que la closure es ejecutada con cada llamada a resolve() yse devuelve una nueva instancia del objeto cada vez. Es aqu donde entra en juego el patrnsingleton.El patrn de diseo Singleton, implica escribir tus clases de una determinada forma para quepuedan ser llamadas usando un mtodo esttico y siempre devolver la misma instancia de smismo. De esta forma la clase solo queda instanciada una vez.Para ms informacin sobre el patrn de diseo Singleton, te sugerira que hicieras una rpidabsqueda en Google o revises el API de PHP que tiene un artculo sobre el tema.Singleton puede ser til, pero necesita una cierta estructura de clase para poder usarlo. Elcontenedor IoC tiene un mtodo singleton() que hace el proceso mucho ms sencillo y nonecesita ningn tipo especial de clase. Registremos LuzAmbiental como singleton:

    1

  • El contenedor IoC 113

    1

  • 21 EncriptacinA veces necesitas proteger datos importantes. Laravel facilita dos mtodos diferentes paraayudarte a hacerlo. Encriptacin en un sentido y en ambos sentidos. Echemos un vistazo a esosmtodos.

    21.1 Encriptacin en un sentidoLa encriptacin en un sentido es la mejor forma de almacenar contraseas de usuarios u otrosdatos sensibles. En un sentido significa que tus datos pueden ser convertidos a una cadenaencriptada, pero debido a un complejo algoritmo con aburridas matemticas, realizar el procesoinverso (desencriptarlo) no es posible.Eso hace que almacenar contraseas est tirado! Tus clientes no tendrn que preocuparse de quesepas sus contraseas, pero aun podrs compararlas (hasheando la contrasea que facilitan) ocambiar la contrasea si te hace falta.Ten en cuenta que hashear es el proceso de crear un hash o una cadena encriptadade otra cadena.Echemos un vistazo a cmo funciona la encriptacin de contraseas en un sentido.

    1

  • Encriptacin 115

    1

  • 22 Contenido AJAXLas aplicaciones web modernas no tienen el tiempo para esperar a la siguiente peticin HTTP.JavaScript ha cambiado la forma en la que navegamos, queremos que nuestro contenido seactualice de forma automtica. Queremos publicar informacin sin tener que recargar la pgina.En el canal IRC de Laravel somos preguntados a menudo cmo usar AJAX con Laravel, lo cualparece confuso porque la respuesta es realmente simple como cualquier otra peticin HTTP.Vamos all y veamos algunas peticiones AJAX usando el framework. Vamos a necesitar haceralgunas peticiones HTTP con JavaScript. Como puede ser algo feo, he decidido usar el frameworkde JavaScript, jQuery en estos ejemplos.

    22.1 Plantilla de la pginaNecesitaremos una vista, o plantilla de pgina que sirva como primera peticin. Dejemos algomuy bsico.

    1 2 3 4 5 6 Mi pgina Ajax7 8 9 10 Hola y bienvenido al sitio!11 12 Cargar contenido13 14

    Ahora tenemos un rea de contenido definida en un elemento con la id de content. Esah donde vamos a cargar nuestro futuro contenido. Tambin tenemos un enlace con la id deload-content que podemos usar como activador para cargar nuestro nuevo contenido dentro dela superior.Antes de que podamos ver esta vista, necesitaremos una ruta para cargarla. Voy a hacer que seami ruta bsica:

    116

  • Contenido AJAX 117

    1

  • Contenido AJAX 118

    1 2 3 4 5 6 Mi pgina Ajax7 8 9 10 Hola y bienvenido al sitio!11 12 Cargar contenido1314 15 var BASE = "";\16 17 18 19 20

    Como puedes ver, he hecho referencia a mis archivos JavaScript antes de la etiqueta de cierre paraque las peticiones HTTP de carga no bloqueen la carga de la pgina. Es una buena prctica queseguir. Comencemos y aadamos algo de JavaScript a nuestro archivo public/js/script.js.Tambin creamos una nueva variable BASE para que JavaScript sepa la URL base de nuestraaplicacin. La necesitaremos luego para crear las URLs de peticin.

    1 // public/js/script.js2 jQuery(document).ready(function($) {3 // Ejecutemos el cdigo cuando4 // la pgina haya sido cargada por completo5 });

    Aqu estamos usando el objeto jQuery() para que se haga con el documento actual, y aadimosun evento ready() con una closure para que contenga nuestro cdigo. Esperando aque documentest listo, podemos asegurarnos de que todos los objetos del DOM han sido cargados y que lalibrera de jQuery ha sido cargada.Puede que veas otros ejemplos como este

  • Contenido AJAX 119

    1 // public/js/script.js2 $(document).ready(function() {3 // Ejecutemos el cdigo cuando4 // la pgina haya sido cargada por completo5 });

    Est bien, pero podra crearte problemas si otras libreras de JavaScript deciden usar el objeto $ms tarde. Mi mtodo usa la clase jQuery y recibe $ en la closure que ha sido asignada al objetojQuery. Esto evita colisiones.Comencemos creando una funcin gestora del evento click para nuestro enlace que cargacontenido. Hay muchas formas de hacer esto con jQuery pero voy a usar el mtodo .click().All vamos:

    1 // public/js/script.js2 $(document).ready(function() {34 $('#load-content').click(function(e) {5 e.preventDefault();6 })78 });

    Ahora ya estamos escuchando al evento. Facilitando el parmetro event llamado e a la closure,podemos usar el mtodo e.preventDefault(); para evitar que la accin de click por defectotenga lugar. En este caso, el link no actuar como un hiper-enlace. Ahora necesitamos hacerotrapeticin HTTP para obtener el nuevo contenido y cargarlo en nuestra zona #content. Usemos elmtodo .get() de jQuery para llevar a cabo esta tarea.

    1 // public/js/script.js2 $(document).ready(function() {3 $('#load-content').click(function(e) {4 // evitamos que la accin por defecto5 // del enlace tenga lugar6 e.preventDefault();78 // intentamos obtener el nuevo contenido9 $.get(BASE+'content', function(data) {10 $('#content').html(data);11 });12 })13 });

    Recuerdas la variable BASE que establecimos antes? Podemos usarla para construir nuestra URLde peticin, y creamos un mtodo callback que capture los datos que obtenemos. Inyectaremosla respuesta de nuestra peticin GET en el elemento #content usando el mtodo .html().

  • Contenido AJAX 120

    Eso fue mucho trabajo, verdad? Al menos ahora podemos ver todo nuestro trabajo en accin,carguemos la aplicacin en http://localhost y hacer click en el enlace de carga de contenido.Espero que haya funcionado!Como puedes ver, usar AJAX con Laravel es lo mismo que usar cualquier otro framework o PHPplano. Solo que tienes que asegurarte de dar formato a las vistas para tus rutas AJAX de la formaadecuada.

    22.3 Envo de datosA veces tendrs que enviar datos adicionales con tus peticiones. Creamos una nueva peticinPOST HTTP con jQuery para demostrar cmo puede hacerse. Priemro tenemos que definir unaruta que responda a la peticin POST.

    1

  • Contenido AJAX 121

    1

  • Contenido AJAX 122

    22.5 Detectando una peticin AJAXA veces es til detectar en la ruta si una peticin viene por AJAX. Por suerte, Laravel facilita unmtodo para detectar peticiones AJAX. Echemos un vistazo.

    1

  • 23 Debugueando AplicacionesLas aplicaciones escritas usando Laravel son mejores sin bugs. Sin embargo, todos sabemos lofcil que es que aparezcan cuando tenemos fechas lmites que cumplir y jefes enfadados encimanuestra.PHP tiene distintos mtodos para el debug. Desde los sencillos, var_dump()s, print_r()s, elfamoso die() y las avanzadas caractersticas del debug con la extensin xdebug de PHP. No voya cubrir esos mtodos bsicos en detalle, porque este es un libro sobre Laravel, no lo bsico sobrePHP. En vez de eso, echemos un ojo a las caractersticas que Laravel noss ofrece para cazar esosbugs.

    23.1 Gestor de erroresLaravel incluye un gestor de errores personalizado que sobrescribe los errores por defecto de unasola lnea de PHP y en vez de ello nos ofrecen ms detalles con una traza completa. Echemos unojo:

    1 Unhandled Exception23 Message:45 View [page.panda] doesn't exist.6 Location:78 /Users/daylerees/www/panda/laravel/view.php on line 1519 Stack Trace:1011 #0 /Users/daylerees/www/panda/laravel/view.php(93): Laravel\View->path('pag\12 e.panda')13 #1 /Users/daylerees/www/panda/laravel/view.php(199): Laravel\View->__constr\14 uct(' page.panda ', Array)15 #2 /Users/daylerees/www/panda/application/routes.php(35): Laravel\View::mak\16 e(' page.panda ')17 #3 [internal function]: {closure}()18 #4 /Users/daylerees/www/panda/laravel/routing/route.php(163): call_user_fun\19 c_array(Object(Closure), Array)20 #5 /Users/daylerees/www/panda/laravel/routing/route.php(124): Laravel\Routi\21 ng\Route->response()22 #6 /Users/daylerees/www/panda/laravel/laravel.php(125): Laravel\Routing\Rou\23 te->call()24 #7 /Users/daylerees/www/panda/public/index.php(34): require('/Users/daylere\25 e...')26 #8 {main}

    123

  • Debugueando Aplicaciones 124

    Este es el error mostrado si solicitamos una vista que no existe en tiempo de ejecucin. Comopuedes ver, tenemos un error informativo de Laravel, as como el error en que se encontr elerror y el nmero de la lnea. Adems, tenemos una traza que muestra el error inicial. Siguiendola llamada del mtodo a travs de la capa View hasta al sistema de rutas.La mayora de las veces no te har falta esta traza pero podra ser til para desarrolladores conms experiencia. Por ejemplo, cuando el error ocurre en una librera compleja.

    23.2 Configuracin de erroresNo siempre queremos que los errores se muestren de esta forma, especialmente en un sitio enproduccin, mostrar una traza podra ser un riesgo de seguridad importante.Por suerte, y como siempre, Laravel nos hace fcil el cambiar la configuracin para mostrar erro-res. El archivo de configuracin para los errores se puede encontrar en application/config/error.php.Echemos un vistazo a las opciones de configuracin que estn en esta matriz.

    1 'ignore' => array(),

    La matriz ignore contiene una lista de errores que sern ignorados. Aunque esos errores no semostrarn al encontrarlos, siempre quedarn registrados. Ten esto en cuenta al usar esta matriz.Para aadir un tipo de error a esta matriz, aade la constante de tipo de error de PHP, o un valorentero a la matriz.

    1 'ignore' => array(E_ERROR);

    Puedes encontrar una lista completa de las constantes de los tipos de errores de PHP en el APIde PHP. Sin embargo, he aqu algunas de las ms tiles.E_ERROR Este error coincidir con todos los errores fatales en tiempo de ejecucin.E_WARNING Esta constante coincide con todas las advertencias o errores no fatales.E_PARSE Esta constante coincide con todos los errores de anlisis o errores de sintaxis.E_NOTICE Esta constante coincidir con todas las notificaciones en tiempo de ejecucin.E_ALL Esta constante coincidir con todos los de arriba, excepto los errores E_STRICT.

    1 'detail' => true,

    La opcin detail puede ser usada para activar/desactivar el detalle de errores detallado.Cuando est activado (true) mostrar el error completo junto a la traza como has visto arriba.Desactivando esta opcin (false) provocar una pgina de error 500 que ser mostrada.

  • Debugueando Aplicaciones 125

    1 'log' => false,

    Si la opcin log est en true, la closure contenida en la opcin logger ser ejecutada con cadaerror y recibir un objeto de excepcin.

    1 'logger' => function($exception)2 {3 Log::exception($exception);4 },

    Por defecto, la closure dentro de la opcin logger escribir una entrada a un archivo de log dentrode storage/logs. Sin embargo, facilitando una closure tenemos un alto grado de flexibilidad,permitindonos sobrescribir el mtodo de registro por defecto con cualquier cosa que e te ocurra.Quiz prefieras guardarlo en una base de datos. Adelante!

    23.3 RegistroPoder mostrar errores y guardarlos en archivos es til, pero qu pasa si queremos escribirnuestra propia informacin? La clase Log de Laravel contiene dosmtodos diferents para registrarinformacin til de tu aplicacin. Echemos un ojo a esos mtodos.El mtodo Log::write() acepta un tipo de registro y una cadena que ser escrita en el archivo.Por ejemplo:

    1

  • Debugueando Aplicaciones 126

    1

  • Debugueando Aplicaciones 127

    With Laravel I think what I want and not how to write it. I enjoy programming. (ConLaravel pienso qu es lo que quiero y no como escribirlo. Me divierto programando.)

    Gracias a Andrew Smith a Julien Tant (AoSix) por comprar el libro. Julien dijo lo siguienteHey Dayle, thanks a lot for this book, the Laravel framework is just awesome ! Ifany french guys read this, visit http://www.laravel.fr/ !

    Gracias chicos y genial trabajo el traducir los tutoriales al Francs!Gracias tambin a Proger_XP por comprar el libro y traducir mis tutoriales al Ruso, que estndisponibles en Laravel.ru. Gran trabajo!

    Me gustara decir gracias a las siguientes personas por comprar una copia de Code Happy!,Gracias

    William Manley Nate Nolting Jorijn Schrijvershof Caleb Griffin Florian Uhlrich Stefano Giordano Simon Edwards

    Me gustara tambin dar las gracias a todos los que enviasteis amables correos sobre el libro,gracias por todo el apoyo!

    Me gustara agradecer a esta gente maravillosa por comprar una copia del libro! Marc Carson David Wosnitza AKA _druuuuuuuu Mark van der Waarde from Alsjeblaft! Joseph Wynn Alexander Karisson Victor Petrov Josh Kennedy Alexandru Bucur

    Hay ms compras que pagaron ms de $9.99 de las que aun no he recibido un correo. Recuerdaque si pagas ms de $9.99 y quieres que tu nombre aparezca en el libro, envame un correo [email protected]! Por desgracia no puedo ver los nombres de aquellos que compraron en lapestaa de ventas.

    ContentsReconocimientoReconocimientos del traductor

    ErratasFeedbackIntroduccinComenzandoMtodo 1 Crea un nuevo host virtualMtodo 2 Enlace simblico a la carpeta pblicaCentrndonos de nuevo

    Estructura de proyectosEstructura del directorio razEstructura del directorio Application

    Usando controladoresEnrutando controlador