la ravel

Upload: franz-reynaldo-acha-pacheco

Post on 13-Jan-2016

14 views

Category:

Documents


0 download

DESCRIPTION

Laravel

TRANSCRIPT

Comunidadmike.nievaMar. 22, 2015

Grupo en Facebook

Cuando estamos rodeados de personas que piensan, comparten y destacan con su talento, irremediablemente empezaremos a hacer lo mismo.

Crecer como comunidad es uno de los retos ms grandes que tenemos como plataforma. Sabemos que cuando un estudiante mejora, el resto tambin lo har.

Es por ello quete invitamos a formarparte de nuestro grupo exclusivoen Facebook.

C1-Reglas de codificacin y lineamientos de cdigo PHPsileenceMayo 9, 2014Siguiendo las sencillas reglas de esta gua permite una mejor organizacin y productividad en la programacin de proyectos en equipos o en solitario. Gran parte de estas reglas estn basadas en las guas de estilo de grandes proyectos libres,como phpBB.Estndares generalesTabs o Espacios.En el contenido dentro de corchetes, siempre se identar este contenido con tabs. Cualquier editor decente puede configurarse para poner tabs en vez de espacios en la identacin (Dreamweaver, Aptana, Eclipse, etc).

Aptana es uno de los editores que dan esa posiblidad.Cabecera del archivoSiempre es importante que todos los archivos .php inicien con una cabecera especfica que indique informacin de la versin, autor de los ltimos cambios, etc. Es de cada equipo decidir si se quiere o no agregar ms datos./** ** @Control de presentacin de los weblogs. "weblog.php"* @versin: 5.4.2 @modificado: 1 de Septiembre del 2006* @autor: Freddie**/Comentarios en las funcionesTodas las funciones deben tener un comentario, antes de su declaracin, explicando que hacen. Ningn programador debera tener que analizar el cdigo de una funcin para conocer su utilidad. Tanto el nombre como el comentario que acompae a la funcin deben bastar para ello.ClasesLas clases sern colocadas en un archivo .php aparte, donde slo se colocar el cdigo de la clase. El nombre del archivo ser el mismo del de la clase y siempre empezar en mayscula. En lo posible, procurar que los nombres de clase tengan una sola palabra.Las clases siguen las mismas reglas de las funciones, por tanto, debe colocarse un comentario antes de la declaracin de la clase explicando su utilidad.HacksLos hacks que sea necesario colocar en el cdigo deben, como las clases o funciones, ser comentados y en lo posible animar a otros programadores a reemplazarlos o mejorarlos por soluciones mejores.Ubicacin de archivosEn proyectos web o aplicaciones, generalmente se tendrn las siguientes carpetas:/ Carpeta raiz:Aqu irn los archivos .php a los que accede el usuario directamente, interfaz, etc.clases:Una carpeta conteniendo exclusivamente las clases usadas en el proyectoincludes:Todos los archivos que sean llamados por otros .php en forma de mdulos o de libreras de funciones.db:En caso de tener la posibilidad de usar varias bases de datos, aqu colocaremos los .php que manejen esas caractersticas multicapa para cada sistema de datos soportado.templates:En caso de usar un sistema de plantillas (Como smarty o el de phpBB), aqu guardaremos todos los archivos .tpl.Estilo y reglas de escritura de cdigo PHPNombres de variablesPor ms que parezca lo ms "cool", se recomiendanoadoptar lanotacin hungaraen el cdigo. Esta es aquella donde colocamos el tipo de datos antes del nombre de variable:strNombrepara un string. En lo posibleNOla usen, muchos grandes proyectos creen firmemente que es una de las tecnicas de ofuscacin de codigo ms ampliamente usadas en la actualidad.Los nombres deben ser descriptivos y concisos. No usar ni grandes frases ni pequeas abreviaciones para las variables. Siempre es mejor saber que hace una variable con slo conocer su nombre. Esto aplica para los nombres devariables,funciones,argumentos de funcionesyclases.Todos los nombres deben estar en minscula (Excepto con las clases, donde la primera letra ha de ser mayscula). En caso de usar ms de una palabra, sta ser separada por un signo de underscore "_".En lasfunciones, es importante que el nombre denote su funcin inmediatamente. Cosas comoimprimir_datosestn bien, pero estara mejorimprimir_datos_usuario. De igual manera, en losargumentosde las funciones queremos saber inmediatamente que estamos usando. Es mejorcrear_usuario($nick, $email)quecrear($n, $e).La filosofa es sencilla. No daes la legibilidad del codigo por pereza. Por supuesto, aplica el sentido comun y no crees funciones de ms de 4 palabras.Siempre incluir corchetesEs sencillo, si ibas a hacer esto:if($cosa) funcion();Mejor haz estoif ($cosa){funcion();}No gastas mucho tiempo adicional y ganas muchsimo en legibilidad.Corchetes o llaves. Donde colocarlasAunque esto sea motivo de peleas constantes en los equipos de trabajo, lo mejor es seguir el camino que permita mayor claridad en el desarrollo. Para ponerlo en pocas palabras, todos los corchetes van en una lnea propia.if (algo){for (iteracion){//cdigo}}while (condicin){funcion();}Poner espacios entre signosOtra cosa simple. Si tienes un signo binario, pon espacios a ambos lados. Tienes un signo unario, pon espacios a uno de sus lados. O en trminos ms simples, programa como si escribieras (bien) en espaol. Es algo muy sencillo que puede ayudar de gran manera en la lectura del cdigo.Esto est mal:$a=0;for($i=5;$i 0) $this->width = $w; }

public function getWidth() { return $this->width; }

public function setHeight($h) { // gd solo maneja enteros, ergo obligamos que alto sea entero $h = (int) $h; // alto debe ser mayor que 0 if ($h > 0) $this->height = $h; }

public function getHeight() { return $this->height; }

/** * Genera una imagen gd del archivo con nombre $filename * Retorna FALSE si ocurrior algun error, por ejemplo: el tipo no es soportado * * @param string $filename nombre del archivo * @param int $type Tipo de imagen para saber que funcion usar * @return resource Una imagen gd. */ protected function gdFromFile($filename, $type) { $gd = false; switch ($type) { case IMAGETYPE_PNG: $gd = imagecreatefrompng($filename); break; case IMAGETYPE_JPEG: $gd = imagecreatefromjpeg($filename); break; case IMAGETYPE_GIF: $gd = imagecreatefromgif($filename); break; } return $gd; }

/** * Guarda una imagen gd en el archivo de nombre $filename * * @param resource $gd La imagen a guardar * @param string $filename nombre del archivo * @param int $type Tipo de imagen para saber que funcion usar * @return bool TRUE en caso de exito, FALSE en caso contrario * */ protected function gdToFile($gd, $filename, $type) { $success = false; // si $filename es nulo las funciones posteriores imprimiran en la salida directamente // aqui tratamos de evitar eso $filename = (string) $filename; if (trim($filename) != "") { // no tiene sentido verificar si el archivo existe, pues si no existe se creara // las siguientes funciones retornan false si ocurrio algun error, true en caso de exito switch ($type) { case IMAGETYPE_PNG: $success = imagepng($gd, $filename); break; case IMAGETYPE_GIF: $success = imagegif($gd, $filename); break; case IMAGETYPE_JPEG: $success = imagejpeg($gd, $filename); break; } } return $success; }

// Obligamos a que las clases que hereden esta clase implementen este mtodo /** * La intencion de este metodo es que guarde la imagen creada en un archivo * * @param string $filename Nombre del archivo * @return bool TRUE en caso de exito, FALSE en caso contrario */ abstract public function save($filename);}

Creamos ImageResize que hereda ImageBase.Cdigo :class ImageResize extends ImageBase{

private $src; private $origWidth; private $origHeight; private $origType; private $hasError = false;

public function __construct($src) { $this->setSrc($src); }

private function setSrc($src) { if (is_file($src)) { // getimagesize retorna un arreglo si tuvo exito con la informacion de la imagen // false en caso contrario $info = getimagesize($src); if ($info !== FALSE) { $this->src = $src; $this->origWidth = $info[0]; // ancho de la imagen $this->origHeight = $info[1]; // alto de la imagen $this->origType = $info[2]; // constante de php que tiene el tipo de imagen, un entero

// por defecto usaremos las dimensiones de la imagen original $this->resize($this->origHeight, $this->origHeight); } else { $this->throwError("$src is not an image file", E_USER_ERROR); } } else { $this->throwError("$src is not file valid", E_USER_ERROR); } }

/** * Asigna los valores a los que se redimensionara la imagen * * @param int $w ancho * @param int $h alto */

public function resize($w, $h) { if ($w < 1) $this->throwError("Ancho debe ser mayor que 0", E_USER_NOTICE); if ($h < 1) $this->throwError("Alto debe ser mayor que 0", E_USER_NOTICE); $this->setWidth($w); $this->setHeight($h); }

/** * Redimensiona la imagen con el ancho y alto asignado en resize * y la guarda en el archivo de nombre $filename * * @param string $filename nombre del archivo * @return bool TRUE en caso de exito, FALSE si algo salio mal */

public function save($filename) { $success= false; // obtenemos la imagen en gd del archivo $orig = $this->gdFromFile($this->src, $this->origType); if ($gd !== FALSE) // si lo obtuvimos { // creamos una imagen vacia con ancho y alto, servira de contenedor $base = imagecreatetruecolor($this->width, $this->height);

// aqui redimensionamos la imagen // la imagen redimensionada queda en $base, esta funcion retorna TRUE si tuvo exito, FALSE en caso contrario $resized = imagecopyresampled($base, $orig, 0, 0, 0, 0, $this->width, $this->height, $this->origWidth, $this->origHeight); if ($resized) // pudimos redimensionar { // guardamos gd en el archivo $filename if (!$this->gdToFile($base, $filename, $this->origType)) { $this->throwError("Archivo no generado", E_USER_WARNING); } else { // todo salio bien $success = true; // liberamos los recursos gd imagedestroy($base); imagedestroy($orig); } } } else { $this->throwError("Gd no fue generado.", E_USER_WARNING); } return $success; }

private function throwError($msg, $level) { trigger_error($msg, $level); }}?>

Uso de ImageResize

Cdigo :

Que otra clase pudiera heredar ImageBase?

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

Se te ocurre una otra? Comenta aqu.

Nota:la implementacin de ambas clases se pueden mejorar. La nica intencin de estas implementaciones es mostrar un ejemplo real de como se deben usar y lo til que son las clases abstractas.

4.1 - Anlisis y extensin de clases en PHP con ReflectionMethodsileenceMayo 9, 2014Reflectiones una clase o ms bien un conjunto de clases dePHPque permiten saber todo sobre tus otras clases, mtodos, funciones, parmetros, etctera... Quizs es una de las funcionalidades ms c00lquePHPha agregado recientemente y quizs una de las que menos se conoce o se usa:ReflectionMethod.

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

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

El mtodo a llamar sea pblicoLa cantidad de parmetros enviados no es menor que la cantidad de parmetros requeridos por el mtodo.

Y adicionalmente les gustara no slo pasar los parmetros como parmetros ordinarios, sino tambin tenerlos disponibles en una clase aparte, es decir, que al llamar a una funcin como:

Cdigo :function verLista($year, $month)

Con los siguientes valores:

Cdigo :call_user_func_array(array($controller, 'verLista'), array(2008, 10));

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

Cdigo :$this->params->year = 2008;$this->params->month = 10;

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

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

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

Cdigo :class ControllerParams{ private $params = array(); function __set($name, $value) { $this->params[$name] = $value; } function __get($name) { return $this->params[$name]; } }

Y aqu el mtodo que hace la funcionalidad ya descripta:

Cdigo :

class Controller{

protected $params = null;

final function execute($action, $params = null) //funcion intermedia { $reflectionMethod = new ReflectionMethod($this, $action); //se crea una instancia de ReflectionMethod con la referencia al metodo que necesitamos llamar

//asi ya tenemos disponible las funcionalidades de ReflectionMethod: if(($action == 'execute') || !$reflectionMethod->isPublic() || (count($params) < $reflectionMethod->getNumberOfRequiredParameters())) { //LANZAR ERROR } $parametros = $reflectionMethod->getParameters(); //con esto obtenemos los parametros de nuestro metodo $this->params = new ControllerParams(); foreach($parameters as $key => $parameter) //y hacemos un ciclo con ellos { $name = $parameter->getName(); //obtenemos el nombre

if(isset($params[$key])) //si el usuario mand algun valor lo asignamos { $this->params->$name = $params[$key]; } else { $this->params->$name = $parameter->getDefaultValue(); //sino tambien podemos tomar el valor por defecto }

} call_user_func_array(array(&$this, $action), $params); //y por ultimo hacemos el llamado de costumbre }

}

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

C2 -10 errores comunes programando orientado a objetos en PHPsileenceMayo 9, 2014El dominio de la programacin orientada a objetos es, sin duda, uno de los paradigmas ms codiciado por los programadores. Sin embargo, muchas veces estos cometen "atrocidades" al intentar implementarlo solo por decir a sus amigos, empresas u otros "Yo s programar orientado a objetos".

A continuacin vern una lista de 10 cosas que no se deben hacer al implementar programacin orientada a objetos enfocndonos en el lenguaje PHP.

Usar variables globales dentro las clases:una de las ventajas ms importantes de la programacin orientada a objetos es la reusabilidad de los cdigos. Al usar variables globales ($_GET, $_SESSION, $_POST, $_COOKIE, global) dentro de las clases, esta se ve comprometida considerablemente. La razn es que todos los proyectosnotienen las mismas variables globales.

Mezclar cdigo HTML en la definicin de las clases:es una de las cosas que me sorprenden cada vez que la veo. Es inaceptable que esto se le haya ocurrido aalgunos. Al mezclar HTML en el cdigo PHP se compromete la reusabilidad de la clase, no todos los proyectos tienen el mismo cdigo HTML.

Imprimir salida (echo) dentro de las clases:aunque esto se parece a la anterior, me refiero a los echo o similares dentro de los mtodos. Si una clase no est destinada para emitir salida no lo debe hacer. Para eso muchos utilizamossistemas de plantillas.

Identificadores de clases, mtodos y propiedades sin sentido:un identificador siempre debe ser lo ms descriptivo posible. A muchos le gusta usar identificadores increblemente irrelacionados con su propsito. Esto compromete enormemente la lectura de un cdigo. (Mira lasreglas de codificacin en PHP)

Mezclar uso de versiones de php en una misma clase:a partir de la versin 5 de PHP, la programacin orientada a objetos se puede implementar de una manera ms formal, pues se introdujo los modificadores de visibilidad public, private, protected. Aparte de que se pueden crear clases de alto nivel (clase Abstractas) y mtodos abstractos con la palabra reservada abstract. Tambin se pueden definir los mtodos y propiedades estticas formalmente con la palabra reservada static. Mezclar la programacin orientada a objetos en PHP 4 (donde todo era publico) con la de PHP 5 hace un cdigo sucio. Consejo: elige una de las versiones y programa para ella.

Ms de una clase en un mismo archivo:definir distintas clases en un mismo archivo es otra de las cosas que no se debe hacer. Las clase se han de componer lo ms reusables posible y si puedes nombrar al archivo con el nombre de la clase muchsimo mejor. Sigue el camino de los grandes lenguajes como: Actionscript, Asp.net, Java entre otros.

No hacer pruebas unitarias a las clases:al terminar de codificar una clase recuerda de hacer pruebas unitarias para asegurar el correcto funcionamiento de clase. Esto es simplemente probar todos los posibles caminos que pueda tomar un estado (propiedad), parmetro de mtodo, etc para que la clase no explote.

Todos los mtodos y las propiedades publicas en una clase de PHP 5:los programadores novatos cometen el error de definir todos los mtodos y propiedades como pblicos, por desconocer las ventajas de los modificadores visibilidad. En PHP este es un problema grave porque no hay tipeado de datos. El problema de las propiedades pblicas es que no podemos controlar de manera fcil el tipo de datos que contiene por lo que nuestra clase pudiera explotar por un tipo de dato inesperado. Si no estas seguro de que visibilidad le debes poner a una propiedad hazla privada. Valida los tipos de datos de las propiedades al menos de una manera bsica.

Duplicacin de mtodos para ocultar falla de lgica:A diferencia de otros lenguajes como Java y C++, PHP no admite la sobrecarga de mtodos. Al menos no de la manera tradicional. Esto, sin embargo, no es excusa para duplicar mtodos slo porque un dato cambia para la operacin que ste realiza.

Variables de configuracin dentro de las clases:Los datos de configuracin de base de datos, web services y otros deben ir en un archivo de configuracin aparte,NOdentro de la clases que hacen uso de estas. Aunque se admite en clases que sea exclusivamente para ello.

2.2 - Configurar Base de Datos y crear tablas con LaravelsileenceAbr. 10, 2014En los tutoriales anteriores, vimos unaintroducin al framework Laravely aprendimoscmo instalar Laravel y Composer. De ahora en adelante comenzaremos untutorial terico - prctico de Laravel.Crear un mdulo de Usuarios con Laravel

Si bien no es el mdulo ms emocionante del mundo, lo considero prctico dado que hace falta en la mayora de las aplicaciones. Para comenzar, necesitamos configurar nuestra base de datos y crear la tabla de usuarios.Cmo configurar la base de datos en Laravel

Lo haremos en cuatro sencillos pasos:

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

2 - En la lnea 29, encontraremos lo siguiente:Cdigo :'default' => 'mysql'

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

3 - Usamos PHPMyAdmin o cualquier otra herramienta de nuestra preferencia para crear la base de datos, en mi caso, conPHPMyAdmin y MySQL crear una DB llamada pruebalaravel:Cdigo :CREATE DATABASE `pruebalaravel` ;

4 - Una vez creada la DB debemos indicarle a Laravel el nombre de nuestra base de datos y un usuario con acceso a ella, para MySQL tenemos en el mismo archivo database.php lo siguiente (lnea 55):Cdigo : 'mysql' => array( 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'pruebalaravel', 'username' => 'root', 'password' => 'CLAVE_ULTRA_SECRETA', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ),

All cambiamos database por el nombre de nuestra base de datos:Cdigo :'database' => 'pruebalaravel',

Y ms abajo el usuario que hayan configurado cuando instalaron MySQL, comnmente root, luego, en la lnea siguiente, el password que dependiendo de su instalacin pudiese estar en blanco o ser una clave ultra secreta.

Una vez configurada la DB, veamos:Cmo crear las tablas en la base de datos con Laravel

Para ello usaremosmigraciones.

Las migraciones permiten configurar y modificar la estructura de una base de datos. Creando una especie decontrol de versiones de base de datosque puede ser usada por una o ms personas dentro del equipo de desarrollo.

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

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

Ahora veamos:Cmo instalar el sistema de migraciones en Laravel

Abrimos nuestra consola o terminal (recuerden usar la consola instalada por GIT si usan Windows) y tipeamos lo siguiente:Cdigo :php artisan migrate:install

Artisan es la interface de comandos de consola que trae Laravel

Si configuramos bien la base de datos deberamos recibir el siguiente mensaje:Cdigo :Migration table created successfully

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

Tabla de migracin creada con xito?S, si vuelves a tu herramienta de base de datos (ej. PHPMyAdmin) vers la siguiente tabla:

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

Siguiente paso:Crear nuestra primera migracin con Artisan y Laravel

Para ello ejecutamos el siguiente comando:Cdigo :php artisan migrate:make create_user_table

Si todo sali bien, recibiremos un mensaje similar a ste:Cdigo :Created Migration: 2013_09_03_211545_create_user_tableGenerating optimized class loader

El primer mensaje (migracin creada) nos indica que fue creado el archivo donde vamos a:Crear el esquema de nuestra tabla usando el Schema Builder

Abrimos el archivo localizado en:Cdigo :app/database/migrations/2013_09_03_211545_create_user_table.php

El nombre del archivo adems de lo especificado por nosotros (create_user_table) contiene una fecha/hora que permite indicarle al framework el orden en que fueron creadas las migraciones, en mi caso2013_09_03_21...

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