domingo, 26 de julio de 2015

Estructura de carpetas de Laravel 5

Laravel, así como cualquier framework PHP, propone una estructura de carpetas, con la que organizar el código de los sitios o aplicaciones web. Como ya somos desarrolladores aplicados ;) deberíamos saber que cuando más separemos el código por responsabilidades, más facilidad de mantenimiento tendrán nuestras aplicaciones. Por lo tanto, en el desarrollo del framework se cuidan mucho estos detalles, para que aquellos desarrolladores que lo utilicen sean capaces también de organizarse de una manera correcta.
En este artículo del Manual de Laravel pretendemos dar un rápido recorrido a las carpetas que vas a encontrar en la instalación de partida de Laravel 5, teniendo en cuenta que en futuras ocasiones quedará pendiente un análisis en profundidad de cada uno de estos elementos.
El objetivo de este artículo es que sepamos más o menos dónde están las cosas en el framework y que tengamos una ligerísima idea de lo que es cada cosa.

Archivos en la carpeta raíz

Los archivos que tenemos sueltos en la carpeta raíz de Laravel son los siguientes (o al menos los más importantes que debes ir conociendo).
.env 
Es la definición de las variables de entorno. Podemos tener varios entornos donde vamos a mantener la ejecución de la aplicación con varias variables que tengan valores diferentes. Temas como si estamos trabajando con el debug activado, datos de conexión con la base de datos, servidores de envío de correo, caché, etc.

Nota: Si .env no se ha generado en tu sistema lo puedes generar a mano mediante el archivo .env.example, renombrando ese fichero o duplicándo y renombrando después. Esto se explicó anteriormente en el artículo llamado Tareas para completar la instalación y problemas comunes.
composer.json 
Que contiene información para Composer. Para conocer algo más de este fichero es mejor que te leas el Tutorial de Composer.

Además en la raíz hay una serie de archivos que tienen que ver con Git, el readme, o del lado frontend el package.json o incluso un gulpfile.js que no vendria muy al caso comentar aquí porque no son cosas específicas de Laravel.

Carpeta vendor

Esta carpeta contiene una cantidad de librerías externas, creadas por diversos desarrolladores que son dependencias de Laravel. La carpeta vendor no la debemos tocar para nada, porque la gestiona Composer, que es nuestro gestor de dependencias.
Si nosotros tuviésemos que usar una librería que no estuviera en la carpeta vendor la tendríamos que especificar en el archivo composer.json en el campo require. Luego hacer un "composer update" para que la nueva dependencia se instale.

Carpeta storage

Es el sistema de almacenamiento automático del framework, donde se guardan cosas como la caché, las sesiones o las vistas, logs, etc. Esta carpeta tampoco la vamos a tocar directamente, salvo que tengamos que vaciarla para que todos esos archivos se tengan que generar de nuevo.
También podemos configurar Laravel para que use otros sistemas de almacenamiento para elementos como la caché o las sesiones.
En cuanto a las vistas cabe aclarar que no son las vistas que vamos a programar nosotros, sino las vistas una vez compiladas, algo que genera Laravel automáticamente en función de nuestras vistas que meteremos en otro lugar.

Carpeta resources

En Laravel 5 han creado esta carpeta, englobando distintos tipos de recursos, que antes estaban dentro de la carpeta app. En resumen, en esta carpeta se guardan assets, archivos de idioma (lang) y vistas.
Dentro de views tienes las vistas que crearás tú para el desarrollo de tu aplicación. En la instalación básica encontrarás una serie de subcarpetas con diversos tipos de vistas que durante el desarrollo podrias crear, vistas de emails, errores, de autenticación. Nosotros podremos crear nuevas subcarpetas para organizar nuestras vistas. A propósito, en Laravel se usa el motor de plantillas Blade.

Carpeta Public

Es el denominado "document root" del servidor web. Es el único subdirectorio que estará accesible desde fuera mediante el servidor web. Dentro encontrarás ya varios archivos:
.htaccess 
En el caso de Apache, este es el archivo que genera las URL amigables a buscadores. <7p>

favicon.ico 
Es el icono de nuestra aplicación, que usará el navegador para el título de la página o al agregar la página a favoritos.

index.php 
Este es un archivo muy importante, que hace de embudo por el cual pasan todas las solicitudes a archivos dentro del dominio donde se está usando Laravel. Estaría bien que abrieras ese index.php para observar lo que tiene dentro. Para el que conozca el patrón "controlador frontal" o "front controller" cabe decir que este index.php forma parte de él.

robots.txt 
Que es algo que indica las cosas que puede y no puede hacer a la araña de Google y la de otros motores de búsqueda.

En la carpeta public podrás crear todas las subcarpetas que necesites en tu sitio web para contener archivos con código Javascript, CSS, imágenes, etc.

Carpeta database

Contiene las alimentaciones y migraciones de la base de datos que veremos más adelante.

Carpeta bootstrap

Permite el sistema de arranque de Laravel, es otra carpeta que en principio no necesitamos tocar.

Carpeta config

Esta carpeta contiene toda una serie de archivos de configuración. La configuración de los componentes del framework se hace por separado, por lo que encontraremos muchos archivos PHP con configuraciones específicas de varios elementos que seguramente reconoceremos fácilmente.
La configuración principal está en app.php y luego hay archivos aparte para configurar la base de datos, las sesiones, vistas, caché, mail, etc.

Carpeta app

Es la última que nos queda y es la más importante. Tiene a su vez muchas carpetas adicionales para diversas cosas. Encuentras carpetas para comandos, para comandos de consola, control de eventos, control de excepciones, proveedores y servicios, etc.
Es relevante comentar que en esta carpeta no existe un subdirectorio específico para los modelos, sino que se colocan directamente colgando de app, como archivos sueltos.
La carpeta Http que cuelga de App contiene a su vez diversas carpetas importantes, como es el caso de aquella donde guardamos los controladores, middleware, así como el archivo de rutas de la aplicación routes.php que vimos anteriormente, entre otras cosas.

Conclusión

Hemos podido conocer de una manera breve los componentes principales del framework Laravel. Como todo en la vida, visto así rápidamente, nos puede parecer que son muchas cosas y difíciles de entender y usar, pero no debemos preocuparnos porque los iremos conociendo poco a poco. Si tienes una base razonable de conocimientos de PHP y patrones de diseño orientado a objetos te resultará fácil usarlos leyendo los siguientes artículos del Manual de Laravel.

Fuente:enlace
Si quieres seguir aprendiendo con nosotros, puedes ingresar a nuestros 
Cursos y Diplomados de Tecnología Web visita www.uneweb.edu.ve  para más información

sábado, 25 de julio de 2015

Organiza los namespaces de PHP en niveles



En un artículo anterior pudimos entender el concepto de namespace en PHP y su uso básico. Ahora vamos a seguir explorando posibilidades del lenguaje para sacarle aún más partido y conocer algunas posibilidades un poco más avanzadas.
Vamos a tocar en este texto varios puntos de diversa índole, como la posibilidad de crear subespacios de nombres, organizar los archivos con código, definir un espacio de nombres en varios ficheros diferentes y cosas de este estilo. Todo orientado a que puedas organizar mejor tu código, sacando partido a los namespaces de PHP.

Crear Sub-namespaces

Es habitual que los desarrolladores creen espacios de nombres dentro de otros espacios de nombres. Por ejemplo, todos los namespaces de una empresa o desarrollador pueden comenzar con su "nick" y luego dentro puedes tener espacios de nombres para cada tipo de utilidad que estás desarrollando.
Imagina que DesarrolloWeb.com se dedicase a fabricar librerías con código PHP, pues todas las librerías podrían estar dentro del espacio de nombres "Deswebcom". Luego podríamos tener librerías que se encargan del trabajo con sesiones, cookies, bases de datos, etc. Podrían estar en sub-namespaces como Deswebcom\Sesiones, Deswebcom\Cookies, Deswebcom\BBDD. Ya dentro de Deswebcom\Sesiones podrías tener una serie de clases, funciones y constantes, o a su vez otros espacios de nombres donde organizas otra serie de librerías. El orden es el que tú necesites y esta organización resulta muy popular. De hecho la puedes ver reproducida en numerosos paquetes de librerías o en la organización de las clases de un framework potente.
La definición de los namespaces y sub-namespaces es prácticamente la que hemos comentado en artículos anteriores. Comienzas el código indicando tu namespace (recuerda que debe ser la primera instrucción del archivo).
<?php
namespace Deswebcom\Galaxias\Andromeda;
Como puedes apreciar, la jerarquía de namespaces se indica con una barra invertida (contrabarra). Puede llegar a tantos niveles como necesites y en cada nivel puedes tener miembros del espacio de nombres. Es decir, en el namespace "Deswebcom" puedo tener clases, funciones, constantes, traits, interfaces y otros namespaces. Dentro de los otros namespaces puedo tener otra vez lo mismo: clases, funciones, otros namespaces, etc.

Organizar archivos con namespaces

La organización de tus archivos en espacios de nombres es muy flexible. Hay lenguajes donde a la hora de definir estructuras similares a los namespaces te obligan a que el código resida en carpetas del mismo nombre. En PHP no es así.
Puedes definir namespaces de cualquier profundidad en archivos que tengas en cualquier carpeta. Puedes usar el mismo namespace en diversos archivos, puedes incluso crear varios espacios de nombres en el mismo archivo.
Lógicamente, aunque PHP te permita muchas alternativas, es interesante que tengas tus propias costumbres y una buena práctica sería crear una estructura de carpetas similar a la estructura de espacios de nombres que estás generando. Eso te ayudará a saber dónde están los archivos que tienen el código de cada espacio de nombres.
Cuando trabajas con jerarquías de espacios de nombres puedes encontrar usos como estos que vamos a relatar.

Mismo espacio de nombres en dos archivos diferentes

Si tienes dos archivos que trabajan dentro de un mismo namespace, entonces, las funciones que crees en ambos espacios de nombres estarán disponibles sin declarar que vas a usar ese espacio de nombre.
Puede parecer obvio, pero veamos un ejemplo de dos archivos que trabajan sobre el mismo espacio de nombres. Como primer archivo:
<?php
namespace Deswebcom\Galaxias;

function observar($a){
    echo "Observando la galaxia $a";
}
Como segundo archivo:
<?php
namespace Deswebcom\Galaxias;

//como este archivo está en el mismo espacio de nombres que el anterior
//soy capaz de invocar una función declarada en este namespace sin indicar su ruta
observar("Centaurus A");

Acceso "relativo" a elementos de otros espacios de nombres

Otra cosa que puede surgir es que desde un espacio de nombres quieras acceder a miembros de otro espacio de nombres dependiente.
En este caso ocurre como cuando usas tu sistema de archivos, siguiendo el símil de las carpetas de un disco duro de tu ordenador. Estando situados en un directorio de tu disco duro, pueden surgir tres escenarios:
  1. Acceso a archivos indicando solo su nombre. Es algo que sueles hacer cuando accedes a un fichero que está dentro de la misma carpeta donde te encuentras. En este caso no necesitamos indicar la ruta completa de esos archivos, ya que estamos en el mismo directorio. 
  2. Acceso a archivos indicando una ruta relativa. Es el caso que suele ocurrir cuando accedes a archivos que están dentro de subcarpetas de la carpeta donde te encuentras. En este caso como posibilidad podríamos definir la ruta relativa al archivo que queremos acceder, desde la carpeta donde estamos. Osea, si tengo un subdirectorio llamado "folder" y dentro de él hay un archivo "file.txt", podríamos acceder por "folder/file.txt". 
  3. Acceso indicando una ruta absoluta. Es el caso típico de acceso a archivos que están en otras rutas no dependientes del directorio donde me encuentro. En este caso lo común y más cómodo es referirnos a los archivos con su ruta absoluta, por ejemplo "/carpeta/subcarpeta/archivo.txt".
Esas mismas situaciones se pueden dar en el uso de namespaces. La primera, acceso a archivos indicando solo su nombre la la hemos visto en el punto anterior, cuando comentábamos que podíamos acceder a funciones definidas en el mismo espacio de nombres como si fueran funciones globales.
La segunda situación la podemos ver en un ejemplo a continuación. Por ejemplo piensa en este espacio de nombres Deswebcom\Galaxias\Andromeda.
<?php
namespace Deswebcom\Galaxias\Andromeda;

function localizar(){
    echo "Soy la galaxia Andromeda y estoy a 3 millones de años luz de la tierra";
}
class Estrella{
    public static function pertenece(){
        echo "Pertenezco a a la galaxia Andromeda";
    }
}
Ahora, si estamos en un espacio de nombres como "Deswebcom\Galaxias", no necesitamos toda la ruta absoluta para llegar a los miembros de "Deswebcom\Galaxias\Andromeda":
<?php
namespace Deswebcom\Galaxias;
include "andromeda.php";

Andromeda\localizar();
Andromeda\Estrella::pertenece();
La tercera posibilidad es también fácil de entender y funcionará siempre, puesto que si indicamos la ruta completa de toda la jerarquía de namespaces, no importa en qué espacio de nombres estamos trabajando. Es decir, indicando el espacio de nombres completo, siempre vamos a poder referirnos a cualquier elemento, independientemente de nuestra posición.
Deswebcom\Galaxias\Andromeda\localizar();
Deswebcom\Galaxias\Andromeda\Estrella::pertenece();
Deswebcom\Galaxias\observar("Via Lactea");
En este caso también admitiría comenzar por una contrabarra toda la ruta jerárquica para el acceso a los namespaces, indicando que el primer namespace "Deswebcom" es de primer nivel.
\Deswebcom\Galaxias\Andromeda\localizar();
\Deswebcom\Galaxias\Andromeda\Estrella::pertenece();
\Deswebcom\Galaxias\observar("Via Lactea");


Fuente:enlace
Si quieres seguir aprendiendo con nosotros, puedes ingresar a nuestros 
Cursos y Diplomados de Tecnología Web visita www.uneweb.edu.ve  para más información

Conoce los verbos en las rutas de Laravel


El sistema de rutas de Laravel es bastante sencillo de utilizar, por lo que en pocos pasos podremos crear todo tipo de rutas bastante complejas. No obstante, al ser tan potente, si quieres analizarlo en profundidad gastarás tiempo. En este artículo pretendemos hacer una primera aproximación al sistema de enrutado de solicitudes HTTP, analizando lo que son los verbos de las solicitudes. En futuras entregas analizaremos otros elementos fundamentales.

Para comenzar no está de más una primera pasada por la documentación oficial, que de un vistazo rápido te dará una idea sobre la multitud de cosas que podrás realizar y configurar. Nosotros estamos utilizando como referencia para este artículo la documentación del sistema de rutas de Laravel 5.1.

Primero queremos recordar que en el Manual de Laravel 5 ya explicamos cómo realizar una primera ruta simple y vimos cosas como la configuración de las funciones anónimas o closures para especificar el tipo de tratamiento que se debe realizar para cada ruta. Esto lo puedes encontrar en el artículo Primera prueba de Laravel con el sistema de rutas y para no repetirnos hay cosas que no volveremos a explicar.

Verbos HTTP

Ya los mencionamos, pero cabe incidir de nuevo sobre los verbos HTTP porque forman parte de las rutas Laravel. Los verbos del HTTP son algo relativo al protocolo de comunicación HTTP, usado en la web, por lo tanto no tienen que ver con Laravel específicamente.

Sirven para decir el tipo de acción que quieres realizar con un recurso (la URL), siendo posible especificar en el protocolo (la formalidad de la conexión por HTTP entre distintas máquinas) el verbo o acción que deseamos realizar.

Son 8 verbos en el protocolo: Head, Get, Post, Put, Delete, Trace, Options, Connect. Y si ya eres desarrollador web y no te suena haberlos usado nunca te diré que realmente no es así. Get es la acción que se usa en el protocolo habitualmente, cuando se consulta un recurso. Sirve para recuperar información. Post por su parte es la acción que se realiza cuando se mandan datos, de un formulario generalmente. Los otros verbos no se usan de una manera muy habitual, pero sí se han dado utilidad en el desarrollo de lo que se conoce como API REST.

Laravel ya viene preparado para implementar APIs REST, así que usa los verbos del protocolo para generar sus rutas de aplicación. De momento nos debe quedar claro que el acceso a un URI como "/test" puede tener diversos verbos a la hora de realizarse por parte de un sistema. Para Laravel el acceso a "/test" (o cualquier otro URI) usando la acción Get no es el mismo que el acceso a "/test" usando la acción Post.

En resumen, el significado de los verbos es:


Get: recuperar información, podemos enviar datos para indicar qué se desea recuperar, pero mediante get en principio no se debería generar nada, ningún tipo de recurso en el servidor o aplicación, porque los datos se verán en la URL y puede ser inseguro. 

Post: enviar datos que se indicarán en la propia. Esos datos no se verán en la solicitud, puesto que viajan con la información del protocolo. 

Put: esto sirve para enviar un recurso, subir archivos al servidor, por ejemplo. No está activo en muchas configuraciones de servidores web. Con put se supone que los datos que estamos enviando son para que se cree algún tipo de recurso en el servidor. 

Delete: borrado de algo. 

Trace, patch, link, unlink, options y connect… no están entre los verbos comunes de Laravel, por lo que te referimos a la Wikipedia para más información.


Registrando rutas con sus verbos

Las rutas se registran con los verbos, usando el método correspondiente de la fachada Route. Ya se ha mencionado pero lo repetimos: Todo el listado de rutas que queramos producir se debe escribir en el fichero app/Http/routes.php


Nota: Es la primera vez en este manual que usamos la terminología "fachada" que es un patrón de diseño de software orientado a objetos usada de manera intensiva en Laravel. Podrás encontrar referencias a este patrón a partir de la palabra "facade", en inglés. De momento vamos a obviar esa palabra para tratarla en detalle más adelante.



La clase Route (la fachada del sistema de rutas) tiene varios métodos estáticos con los verbos sobre los que queremos dar de alta una ruta de la aplicación. Anteriormente comentamos que estos métodos reciben dos parámetros, uno el patrón o URI que queremos registrar y otro la función con el código a ejecutar.

Route::get('/probando/ruta', function(){ //código a ejecutar cuando se produzca esa ruta y el verbo return 'get'; }); Route::post('/probando/ruta', function(){ //código a ejecutar cuando se produzca esa rutay el verbo POST return 'post'; }); Route::put('/probando/ruta', function(){ //código a ejecutar cuando se produzca esa rutay el verbo PUT return 'put'; }); Route::delete('/probando/ruta', function(){ //código a ejecutar cuando se produzca esa rutay el verbo DELETE return 'delete'; }); Usar varios verbos a la vez al registrar una ruta




Como puedes imaginar, existen casos en los que te puede interesar registrar una ruta que tenga validez con varios verbos, indicando una única función que los resuelva todos. Esto se puede conseguir mediante dos métodos distintos.

Route::match(['get', 'post, 'put''], '/testing', function () { echo 'Ruta testing para los verbos GET, POST, PUT'; });




Como puedes apreciar, el método match requiere un parámetro adicional, el primero, en el que indicamos un array con los verbos que queremos aplicar a esta ruta.

Por otra parte tenemos el método any, que es como un comodín, que sirve para cualquier tipo de verbo del HTTP.

Route::any("/cualquiercosa", function(){ echo 'La ruta /cualquiercosa asociada a cualquier verbo'; });



Cómo probar los verbos de HTTP

Desde un navegador podrás probar fácilmente cualquier ruta con el verbo GET. Será simplemente escribir la URL en la barra de direcciones del navegador. Sin embargo, para probar el método post necesitarás crearte un formulario. Y si se trata de probar PUT o DELETE la cosa es más complicada porque necesitarías algún tipo de script especial.

Pero hay una alternativa muy cómoda que te permitirá probar cualquier tipo de verbo y enviar cualquier tipo de parámetro en la solicitud HTTP. Se trata de utilizar algún cliente Rest que podemos descargar como complemento en el navegador.

Una posibilidad es Postman, un cliente REST que es muy fácil de usar. Esta extensión disponible en Chrome o también en Firefox.

A través de esta herramienta eres capaz de escribir una URL, el método o verbo de la conexión y a través del envío de la solicitud (botón send) recibir y visualizar la respuesta de Laravel.

Así que con postman ya podemos crear todo tipo de rutas en el sistema de enrutamiento y comprobar qué es lo que está pasando. Como sugerencia os indico justamente eso, probar distintos verbos, crear el código para registrar las rutas y ejecutarlas a través de Postman.


Nota: Si quieres probar rutas diferentes de GET observarás que no se puede. Al intentar hacer post, put o delete te sale un mensaje: "TokenMismatchException".



Esto es debido a que en Laravel está activado un sistema antispam para solicitudes diferentes de GET, potencialmente más peligrosas, por el cual se debe comprobar un token. Hablaremos de ello más adelante. De momento vamos simplemente a desactivarlo.

En el archivo app/Http/Kernel.php encontrarás el "global HTTP middleware stack", osea la pila de middlewares que se ejecutan de manera global en las solicitudes HTTP. Busca la línea que hace la carga de VerifyCsrfToken::class, y coméntala.

//\App\Http\Middleware\VerifyCsrfToken::class,



Conclusión

Hemos hablado de verbos en la solicitud HTTP, y a la vez hemos continuado aprendiendo del sistema de routing de Laravel. Pero nos gustaría que quedase claro que desde el navegador generalmente vas a realizar siempre solicitudes GET, o POST si envias datos de formulario.

Para usar los otros verbos que puedes controlar en Laravel realmente necesitas de un cliente REST, que sea capaz de ejecutar acciones como PUT o DELETE. Tendrán sentido usar en tus rutas cuando estés construyendo un API REST con Laravel.


Fuente:enlace

Si quieres seguir aprendiendo con nosotros, puedes ingresar a nuestros 
Cursos y Diplomados de Tecnología Web visita www.uneweb.edu.ve  para más información

Entradas populares