Feb 17

Si no tenemos un administrador de BDD y necesitamos ejecutar un script SQL, que puede ser un backup, entonces podemos realizar lo siguiente:

  1. Ingresar con SSH (recomendado) o Telnet a nuestro servidor
  2. Cargar el archivo SQL en el directorio que desees
  3. Ingresar via consola a la ubicacion del archivo SQL que acabas de cargar
  4. Ejecutar el comando:
     mysql -u "USUARIOBDD" --password="PASSBDD" < ARCHIVOSQL

Donde:

  • USUARIOBDD:Usuario para la conexion con la Base de Datos
  • PASSBDD:Clave para la conexion con la Base de Datos
  • ARCHIVOSQL.sqlArchivo SQL que sera ejecutado

NOTA: Dentro del archivo SQL se deberá especificar la Base de Datos que se desea utilizar. Para ello será:

USE NOMBREBDD;

Donde NOMBREBDD es el nombre de la base de datos a la cual tiene acceso el usuario USUARIOBDD.

Dic 21

Escribir nuestro código de acuerdo a estandares, es una práctica que permite mejorar la legibilidad, mantenimiento y profesionalismo de nuestro trabajo.

Cada empresa puede tener incluso sus propios estandares, pero como controlar que son aplicados?. Esta tarea puede resultar impracticable pues sería necesario revisar cada línea de codigo, sin embargo podemos automatizar este proceso usando PHP_CodeSniffer una librería PEAR que hára esto por nosotros.

PHP_CodeSniffer permite verificar la aplicacion de estandares en archivos PHP, JavaScript y CSS

PHP_CodeSniffer tiene pre configurado los estandares de Zend, PEAR, PHPCS, Squiz and MySource, que pueden ser usados inmediatamente, además permite usar uno definido por nosotros.

Tambien existe el proyecto PHPCS que tiene los estandares de Zikula

Jun 06

El Modelo
La ‘M’ de los sistemas MVC se refiere al modelo, es responsable de ejecutar consultas a la base de datos (u otra fuente externa como pueden ser archivos xml, csv, etc.) y proveer los datos al controlador. Nosotros debe cargar el modelo apropiado dependiendo de la solicitud de nuestro cliente, algunas personas prefieren no utilizar una clase modelo y utilizar en el controlador una librería que haga la abstracción de la BDD, como por ejemplo AdoDB, sin embargo el modelo también puede hacer uso de esta librería o utilizar las funciones nativas de php directamente. Todo depende del tamaño de la aplicación y lo práctico que resulte en la solución que propongamos

Algo que debemos hacer es agregar el código necesario para inicializar una conexión con la base de datos, y añadirlo a nuestra pagina inicial (index). Existe varias librerías de abstracción de la BDD disponibles, pero PHP5 ya viene con una gran librería PDO, entonces es posible que no necesitemos alguna más.

Ahora, colocamos el siguiente código en el archivo index (luego de incluir el archivo de inicialización):

# Conexión con la BDD
$db = new PDO('mysql:host=localhost;dbname=demo', '[usuario]', '[clave]');
$registry->set ('db', $db);

En el ejemplo anterior primero creamos una nueva instancia de la libreria PDO, y nos conectamos a nuestra base de datos MySQL. Posteriormente hace global la conexión mediante nuestra clase Registry.

La parte del modelo de nuestro sistema, esta terminada, por lo que vamos a pasar con con la siguiente parte: codificar el controlador.
Codificar el controlador también significa que nosotros debemos codificar la clase Router. Una clase Router es responsable de cargar correctamente el controlador, basada en las solicitudes (la variable $router pasada a través de la URL). Entonces vamos a codificar la clase Router primero.

La clase Router
Nuestra clase Router deberá analizar la solicitud del cliente y cargar el comando correcto. El primer paso es crear el esqueleto básico de la clase Router:

Class Router
{
private $registry;
private $path;
private $args = array();

function __construct($registry) {
$this->registry = $registry;
}
}

Y agregamos las siguiente líneas al archive index.php:

# Carga el router
$router = new Router($registry);
$registry->set ('router', $router);

Ahora hemos añadido la clase Router a nuestro sistema MVC, pero esta no hace nada aún, entonces debemos agregar varios métodos a nuestra clase.
El primer metodo que debemos agregar es setPath(), el cual es utilizado para definir el directorio donde se almacenan todos nuestros controladores. El metodo setPath() es similar al siguiente y require ser agregado a la clase Router:

function setPath($path)
{
$path = trim($path, '/\\');
$path .= DIRSEP;
if (is_dir($path) == false) {
throw new Exception ('Path Invalido: `' . $path . '`');
}
$this->path = $path;
}

Nota: Si su sistema no tiene la constante DIRSEP, prueben con DIRECTORY_SEPARATOR

Luego, agregamos la siguiente línea en el archivo index.php:

$router->setPath (site_path . 'controllers');

Ahora nosotros ya tenemos definido el path a nuestros controladores, entonces podemos escribir el método responsable de cargar el controlador correcto. Este método es llamado delegate(). Una primera versión de este método puede ser como sigue:

function delegate()
{
// Obtiene el controlador
$this->getController($file, $controller, $action, $args);

Como pueden ver, hace uso de otro método, getController() para obtener el controlador. Este método sería algo así:

private function getController(&$file, &$controller, &$action, &$args)
{
$route = (empty($_GET['route'])) ? '' : $_GET['route'];
if (empty($route)) { $route = 'index'; }
// Separa las partes
$route = trim($route, '/\\');
$parts = explode('/', $route);
// Busca el controlador correcto
$cmd_path = $this->path;
foreach ($parts as $part) {
$fullpath = $cmd_path . $part;

// Existe un directorio con el path completo?
if (is_dir($fullpath)) {
$cmd_path .= $part . DIRSEP;
array_shift($parts);
continue;
}
// Busca el archivo
if (is_file($fullpath . '.php')) {
$controller = $part;
array_shift($parts);
break;
}
}
if (empty($controller)) { $controller = 'index'; };
// Obtiene la accion
$action = array_shift($parts);
if (empty($action)) { $action = 'index'; }
$file = $cmd_path . $controller . '.php';
$args = $parts;
}

Veamos un poco el funcionamiento de este método. Primero obtiene el valor de la variable $route y procede a separarla en partes, utilizando la función explode(). Si la solicitud es ‘miembro/ver’ esto debería dividirlo en un arreglo: array(‘miembro’, ‘ver’).

Podemos utilizar el loop foreach para recorrer cada parte y primero chequear si cada parte es un directorio. Si lo es, lo agregamos en el filepath y nos movemos a la siguiente parte. Esto permite poner al controlador en subdirectorios, y utilizar jerarquía en los controladores. Si una parte no es un directorio pero es un archivo, almacenamos esto en la variable $controller, y salimos del loop por que hemos encontrado el controlador que queríamos.

Luego del loop nos aseguramos que el controlador ha sido encontrado, y si no existe un controlador ponemos por omisión a uno llamado ‘index’.
Procedemos a obtener la acción que deseamos ejecutar. El controlador es una clase que se compone de varios métodos, y las acciones apuntan a uno de estos métodos. Si no se especifica una accione llamaremos a una acción llamada ‘index’.

Finalmente, obtenemos el path complete del archive controlador concatenando el path con el nombre del controlador y su extensión.

Ahora que la solicitud ha sido analizada se la envía al método delegate() para cargar el controlador y ejecutar la acción. El método delegate() complete sería algo así::

function delegate()
{
// Analiza la ruta
$this->getController($file, $controller, $action, $args);
// El archivo existe?
if (is_readable($file) == false) {
die ('404 Not Found');
}
// Incluye el archivo
include ($file);
// Inicializa la clase
$class = 'Controller_' . $controller;
$controller = new $class($this->registry);
// Existe la Accion?
if (is_callable(array($controller, $action)) == false) {
die ('404 Not Found');
}
// Ejecuta la acción
$controller->$action();
}

Luego de tener analizada la solicitud con el metodo getController(), primero debemos asegurarnos que el archivo existe y si no retornar un sencillo mensaje de error.

La siguiente cosa que debemos hacer es incluir el archivo controlador, e inicializar la clase, que siempre debe ser llamada Controller_[nombre]. Luego aprenderemos mas sobre el controlador.

Entonces verificamos si la acción existe y es ejecutable utilizando is_callable(). Finalmente, ejecutamos la acción, que completa el rol del router.

Ahora que tenemos funcionando completamente el método delegate(), agregamos las siguientes líneas al archivo index.php:
$router->delegate();

Si intentan ejecutar el archivo ahora, obtendremos el siguiente error por que no tenemos creado el directorio ‘controllers’:

Fatal error: Uncaught exception 'Exception' with message 'Invalid controller path: `g:\Projects\PHPit\content\simple mvc php5\demo\controllers\`' in g:\Projects\PHPit\content\simple mvc php5\demo\classes\router.php:18 Stack trace: #0 g:\Projects\PHPit\content\simple mvc php5\demo\index.php(13): Router->setPath('g:\Projects\PHP...') #1 {main} thrown in g:\Projects\PHPit\content\simple mvc php5\demo\classes\router.php on line 18

O obtendremos ‘404 Not Found’ porque no tenemos controladores creados aun. Pero ese es el tema de la siguiente parte de este tutorial.

Abr 22


Resumen


En este tutorial usted va a aprender como construir un sistema Modelo-Vista-Controlador simple con PHP 5.1 y algunas de las características de la Biblioteca Estándar de PHP (SPL’s).


Introducción


Bienvenido al primer tutorial de PHP5, usted necesitará tener PHP 5.1y SPL instalado para seguir este tutorial, esto debido a que utilizaremos varias de las ultimas características existentes en PHP5
En este tutorial voy a mostrarles como construir un sistema Modelo-Vista-Controlador simple, el cual es el patrón de diseño más común para el desarrollo de grandes aplicaciones Web. Voy a guiarte por todos los pasos necesarios para iniciarte en el mundo de un verdadero sistema MVC


Un punto de entrada


Una aspecto importante relacionado con nuestro sistema MVC es que éste debe tener un único punto de entrada. Envés de tener varias docenas de archivos PHP que realicen lo siguiente:

include ('global.php');
// Aquí el código de la pagina actual
?>

Tendremos una sola página que maneje todas las peticiones. Esto significa que no tendremos que incluir el archivo global.php cada vez que deseamos crear una página nueva. Este “único punto de entrada” será llamado “index.php” y, hasta el momento, será algo así:

// Hace alguna cosa
?>

Como se puede apreciar, la página principal no hace nada todavía, pero lo hará en un minuto.
Para cerciorarse de que todas las peticiones vayan a la página principal configuraremos RewriteRule en el archivo .htaccess utilizando para ello el modulo de apache mod_rewrite. Debemos colocar el archivo llamado “.htaccess” en el mismo directorio que se encuentra el archivo de index.php y debe incluir el siguiente código:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]

Primero comprobamos si existe el archivo actual con el comando RewriteCond, y si no existe, lo redireccionamos al archivo index.php. Tenemos que comprobar si el archivo existe, porque también deseamos poder utilizar archivos normales que no son PHP, tales como imágenes JPEG.

Si usted no puede utilizar .htaccess o el modulo mod_rewrite, debería realizar las redirecciones manualmente a través de peticiones al archive index.php, lo cual significa que sus enlaces deben seguir el formato “index.php?route=[petición-va-aquí]“, ejemplo: index.php?route=chat/index.

Ahora que todas las peticiones están pasando a través de un solo punto de entrada, podemos comenzar a escribir el archivo index.php. Las primeras cosas que tendremos que realizar son algunas tareas inicialización. Para ello creamos un nuevo directorio llamado “includes”, y en este directorio creamos un nuevo archivo llamado “startup.php”. Luego debemos poner el siguiente código en el archivo index.php:

# Tareas de inicialización (definición de constantes, etc.)
require 'includes/startup.php';

Jul 23

Los estereotipos con color se constituyen en bloques pequeños en el modelo que resultan ser muy útiles. Si lo vemos un paso mas alla, estos cuatro estereotipos con color encajan en otros modelos de una manera bastante repetitiva y predecible. Esto se lo comoce como “componente netral de dominio”

Se han modelado cientos y cientos de modelos, todos de estos siguiendo el componente neutral de dominio. Este modelo se muestra a continuación

sin-titulo-9.jpg

Click para ver grande

Jul 23
Nuestros modelos siempre tendrán los cuatro tipos de estereotipos: role, moment-interval, thing, y description. Entonces asignemos a los estereotipos un color, para agregarle todo el impacto que estos producen en nuestros modelos

Los moment-interval estan atados al modelo de componentes. Los moment-interval expresan el corazón y alma de todo lo que es un componente. En un modelo, los intervalos de tiempo encapsulan a menudo los métodos más interesantes. Se le asigna el color rosado por ser uno de los colores que más llama la atención.

Los Roles son los siguientes más importante en un modelo. Los metodos de los roles incluyen a los métodos como “evaluación de desempeño” o “fijación de valores”. Se utiliza el siguente color que llama la antención, amarillo.

Las cosas (things) comunmente son los proximos en la línea. Las cosas actúan a menudo como contenedores para otros objetos y normalmente incluyen los métodos como “evaluación de desempeño” o “fijación de valores”. Las descripciones (descriptions) se encuentran en el ultimo lugar. Incluyen a menudo a los métodos como “cuánto existe disponible” y “calcular el total para una cantidad”. Las cosas (things) también podrían tener descripciones (descriptions) correspondientes. Se les asigna el color verde (para las cosas) y azul (para la descripciones).

Así se veria un modelo de acuerdo a la asignacion de colores:

sin-titulo-1.jpg

Cada uno de estos cuatro colores corresponde a las características de un estereotipo, los atributos, enlaces, métodos, puntos de conexion (plug-in points) e interacciones que las clases siguen.

Las características de un estereotipo incluyen atributos y enlaces. Una descripción (azul) define su tipo, descripción, número de artículo, y el valor(es) predefinidos. Una parte, lugar o cosa (verde) tiene definido su número de serie, dirección, y valor(es) predefinidos. Un rol (amarillo) define su número asignado y estado. Un moment-interval rosado sabe su número, fecha (u hora o intervalo de tiempo), su prioridad, su total, y su estado. Estos siguen el siguiente patrón: un azul enlaza a un verde, el verde enlaza a un amarillo, el amarillo enlaza a un rosado. A veces no necesitamos un verde y un amarillo en dicho caso se enlace del azul al rosado.

sin-titulo-2.jpg

Otra caracteristica de un estereotipo son los metodos

Una descripcion (azul) encuentra disponibles y calcula la cantidad de disponibles (en ambos casos, interactuando con su correspondiente parte, lugar o cosa (verde))

Una parte, lugar o cosa (verde) determina si actualmente esta disponible (verificando el estado o interactuando con sus roles (amarillos)). Este obtiene sus valores predefinidos si no estan presentes, pregunta a su correspondiente descripcion (azul) por los valores predefinidos. Tambien fijan sus valores para el negocio y evaluan el desempeño (en ambos casos interactuando con sus roles (amarillo))

Un rol (amarillo) determina si esta dispoble para represantar el rol (puede estar ocupado), fijando los valores para el negocio y evaluando su desempeño, en todos los tres casos mediante la interacción con su moment-interval rosado.

Un moment-interval rosado es producido (para apoyar al proceso de negocio) agregando detalles (partes), y calculando su total (interactuando con su parte para hacer eso). Este recalcula su total (forzando a recalcular, sin tener en cuenta cualquier valor interno almacenado en el buffer). Acepta mensajes preguntando si esta completo o interrumpe (cancela) el moment-interval. Tambien provee un comportamiente respecto a otros moment-interval (designados con el prefijo “mi_”): origina el siguiente, lo evalua con respecto a anteriores moment-intervals, evalua con respecto a moment-interval subsiguientes, y compara el plan vs lo actual. Tambien tiene dos metodos subrayados con el comportamiento de todos los objetos en la clase: lista todos los objetos moment-interval y calcula el moment-interval promedio (normalmente la cantidad promedio, aunque algunas veces puede ser el promedio de pesos o promedio del tiempo que le toma realizar algo)

sin-titulo-3.jpg

Notese que se sigue los siguientes patrones para nombrar a los métodos:

- Make (para crear objetos, incluyendo las reglas de negocio para poder crearlo)

- Object-specific, calculos y valoraciones propias de los Objetos

- Metodos moment-interval (MI),  interactuan con otro objeto rosado (agregamos el sufijo “mi” para separar en la lista estos metodos de los otros)

- Los metodos subrayados, indican metodos estaticos (o clases), que actua en el conjunto de todos los objetos en esta clase

Las caracteristicas de un estereotipo incluyen puntos de conexion (plug-in points) para adaptar el comportamiento de un estereotipo. Una descripción (azul) requiere de un punto de conexión cuando esta tiene un algoritmo complejo y nosotros queremos proporcionar la opcion de “enganchar”, “conectar” o “aclopar” un nuevo compartamiento (del algoritmo) las veces que queramos. Un moment-interval (rosado) requiere un punto de conexión siempre que el proceso de negocio es bastante complicado lo que nos sugiere diseñar un punto de conexión (plug-in) flexible para adaptarnos facilmente (anticipadamente o inanticipadamente) cada vez el proceso de negocio cambie

sin-titulo-4.jpg

La siguiente figura resume los atributos, enlaces, métodos, y puntos de conexion de los estereotipos. Sobre las interacción se hablara en otro post.

sin-titulo-5.jpg

Normalmente se incluyen puntos de conexion (plug-in points) a intervalos de tiempo complejos (el y sus partes) y a descripciones (azules) con muchos calculos o calculos intensivos.

Otro punto que vale la pena mencionarlo es que a menudo, un moment-interval (rosado) tiene partes, llamados detalles del intervalo de tiempo (moment-interval). Se debe pensar en ellos como un intervalo del intervalo de tiempo y que es “algo” que requiere hacer por si mismo su trabajo o función

sin-titulo-6.jpg

Un detalle de intervalo de tiempo (moment-interval) sabe su cantidad y calcula su total

Jul 23

Asociación

Las asociaciones son conexiones conceptuales entre clases. Por ejemplo la asociación, entre trabajador y empresa.

“Un trabajador labora en una empresa” la asociación conectara con una línea a trabajador y empresa, si vemos los roles de cada uno podemos decir que el trabajador es un empleado y la empresa es la empleadora.

“Labora en” es el nombre de la asociación y la colocamos sobre la linea, mientras que los roles (empleado, empleador) los colocamos bajo la línea a cada lado según corresponda. Así nuestra relación “Un trabajador labora en una empresa” en UML se vería así:

Asociación

Las asociaciones pueden funcionar en ambos sentidos. Si vemos el ejemplo anterior desde la perspectiva de la empresa, la asociación sería “Una empresa emplea trabajadores”

Asociación viceversa

Notemos que para comprender el sentido de la asociación añadimos una flecha.

Las asociaciones no se limitan conectar una clase con otra, pueden conectarse varias clases con una.

Asociación multiple

Cuando necesitamos especificar mas detalles en las asociaciones como restricciones podemos especificarlas encerrándolas entre llaves. Por ejemplo un cajero atiende a un cliente, pero cada cliente es atendido en el orden de su llegada.

Asociación con restriccion

La restricción del tipo “O” se la representa con una línea entrecortada que una las 2 relaciones. Por ejemplo un estudiante de educación media superior puede elegir entre un curso académico o uno comercial.

Asociación O

Multiplicidad

La multiplicidad indica la cantidad de objetos de una clase que se relacionan con otro objeto en particular de la clase asociada.

En el ejemplo de la relación “Un trabajador labora en una empresa”, aplicando la multiplicidad sería “Uno o varios empleados trabajan en una empresa”. Y el diagrama se vería asi:

Asociacion con multiplicidad

Notemos que usamos * como comodín para indicar la palabra “varios”

Asociaciones calificadas

Cuando la multiplicidad de una asociación es de uno a muchos, en ocaciones se requiere seleccionar un objeto específico para cumplir la asociación. Para seleccionar el objeto se necesita un identificador que permita diferenciarlo del resto de objetos a este se le llama calificador. Por ejemplo, cuando se realiza una reservacion en un hotel, el hotel le asigna un numero de confirmación. Si se requiere hacer preguntas respecto a la reservacion, se deberá proporcionar el número de confirmacion que en este caso actua como identificador.

En UML esto se representa con un rectángulo adjunto a la clase que usará el calificador.

Asociacion calificativa

Asociaciones reflexivas

Esta se da cuando una clase se asocia consigo mismo. Por ejemplo en la clase empleado, un empleado puede actuar como jefe o subalterno.

Asociacion reflexiva

Herencia y generalización

La herencia y generalización son sinónimos dentro de UML.

La generalización permite que una clase “hija” herede todos los atributos y propiedades de la clase “madre”. Por ejemplo las clases vertebrados e invertebrados pueden heredar de animal.

Herencia

La representacion de herencia en UML es a través de una línea que termina con un triángulo sin relleno.

Dependencias

Se define cuando una clase utiliza a otra como parámetro de una de sus operaciones.

Por ejemplo imaginemos que tenemos 2 clase una sistema y otra formulario. Una de las operaciones de sistema es mostrarFormulario(), la cual tiene como parámetro la clase formulario, esto se representa en UML así:

Dependencia

Agregación

Una agregación es una acumulación de clases. Es decir una clase esta formada por otras.

Por ejemplo un auto esta formado por su motor, chasis, corrocería entre otras cosas. En UML esto se representaría asi:

Agregación

Composición

Una composición es un tipo de agregación, la cual determina una restricción. Cada componente de una agregacion puede pertenecer tan solo a un todo.

Esto se representa de igual forma que una agragacíon, con la diferencia de que el rombo esta rellenado

Realización

Una realización es la relación entre una clase y una interfaz.

Una interfaz define las capacidades o habilidades de un objeto.

Veamos un ejemplo. El teclado de la computadora esta basada en la presión de las teclas de igual forma que el teclado una máquina de escribir. La operación básica (teclazo) es comun para ambos tipos de teclado, sin embargo el teclado de computadora tiene otras opreaciones como ctrl, alt, etc.

Podríamos decir que el teclado de la máquina de escribir es una interfaz del teclado de computadora pues define al habilidad de teclazo. Esto en UML se representaría así:

Realización


Switch to our mobile site