¿Qué son los patrones de diseño?. El patrón Singleton. El patrón Registry
El patrón Factory. El patrón Decorator
El patrón Observer. El patrón Front Controller.
El patrón MVC
Seguridad Web
Conceptos y buenas prácticas.
Ataques XSS
Ataques CSRF
Ataques SQL-injection
Ataques de sesión: Session riding
Inyección remota de código
PHP es un lenguaje de scripting orientado al desarrollo de aplicaciones web. En una primera parte se explica los principios del lenguaje, algunas herramientas y un esbozo de una aplicación web escrita en PHP. En una segunda parte se presenta Symfony, un framework PHP que reúne las mejores prácticas de desarrollo de aplicaciones web.
Seguridad Web
Conceptos y buenas prácticas.
Ataques XSS
Ataques CSRF
Ataques SQL-injection
Ataques de sesión: Session riding
Inyección remota de código
PHP es un lenguaje de scripting orientado al desarrollo de aplicaciones web. En una primera parte se explica los principios del lenguaje, algunas herramientas y un esbozo de una aplicación web escrita en PHP. En una segunda parte se presenta Symfony, un framework PHP que reúne las mejores prácticas de desarrollo de aplicaciones web.
Documento Formativo de Symfony2 en el que explica desde qué es Symfony hasta los primeros pasos básicos: instalación, configuración, entidades, Twig, YAML...
CRUD básico con Symfony. Esta presentación es una continuación de lo contado en la II Symfony Zaragoza. Explica un ejemplo sencillo de un CRUD para mostrar como realizar modelos, controladores, vistas, formularios, etc.
Las buenas prácticas oficiales para aplicaciones Symfonysymfony_bcn
La primera versión del framework Symfony2 se publicó hace más de tres años. Durante este tiempo, la comunidad de programadores Symfony ha originado una serie de buenas prácticas oficiosas que han sido adoptadas por la mayoría de aplicaciones.
Lamentablemente muchas de estas prácticas tienen poco que ver con la visión original de los creadores de Symfony y complican en exceso el desarrollo de las aplicaciones.
En esta sesión se presentarán muchas de las buenas prácticas oficiales recomendadas por Fabien Potencier, creador de Symfony. Sorpréndete con una visión totalmente renovada y pragmática del desarrollo de aplicaciones Symfony profesionales.
PHP, una introducción a modo de presentación como tutorial básico llegando hasta clases y pasando por la conexión con una oferta de servicios web mediante protocolo SOAP con WSDL.
Documento Formativo de Symfony2 en el que explica desde qué es Symfony hasta los primeros pasos básicos: instalación, configuración, entidades, Twig, YAML...
CRUD básico con Symfony. Esta presentación es una continuación de lo contado en la II Symfony Zaragoza. Explica un ejemplo sencillo de un CRUD para mostrar como realizar modelos, controladores, vistas, formularios, etc.
Las buenas prácticas oficiales para aplicaciones Symfonysymfony_bcn
La primera versión del framework Symfony2 se publicó hace más de tres años. Durante este tiempo, la comunidad de programadores Symfony ha originado una serie de buenas prácticas oficiosas que han sido adoptadas por la mayoría de aplicaciones.
Lamentablemente muchas de estas prácticas tienen poco que ver con la visión original de los creadores de Symfony y complican en exceso el desarrollo de las aplicaciones.
En esta sesión se presentarán muchas de las buenas prácticas oficiales recomendadas por Fabien Potencier, creador de Symfony. Sorpréndete con una visión totalmente renovada y pragmática del desarrollo de aplicaciones Symfony profesionales.
PHP, una introducción a modo de presentación como tutorial básico llegando hasta clases y pasando por la conexión con una oferta de servicios web mediante protocolo SOAP con WSDL.
Drupal 8 ya está en camino y sabemos lo que estás pensando… ¿Cuáles son los cambios principales?
Este webinar de tan solo 1 hora de duración ofrece un panorama detallado de los cambios principales que podrás encontrar en Drupal 8 y una mirada exclusiva a algunas de las nuevas funciones y capacidades que estos cambios traen consigo:
- Editores: Views en el Core, más ( y mejores) bloques, funcionalidades de Entity mejoradas, etc.
- Desarrolladores de Front-end: HTML5, biblioteca, mejoras en accesibilidad, temas nuevos y elementos del UI, mejor rendimiento, etc.
- Desarrolladores de Back-end: Nuevo sistema de gestión de configuraciones, API Entity modificado por completo, caching mejorado y nuevas funciones de servicios integrados
En esta presentación damos un repaso de lo que son dependencias, el uso de dependency managers y la ventajas que nos ofrecen. Revisamos en qué consisten los submódulos GIT, Cocoapods y Carthage, señalando sus ventajas/desventajas y como podemos incorporarlos en nuestros proyectos.
Combinación ganadora: Plone como CMS, tu framework preferido como frontendmenttes
Plone es un excelente sistema de gestión de contenidos. Recientemente ha sido elegido como el mejor CMS no-PHP en un popular concurso anual. A pesar de esto, muchos desarrolladores web de Python encuentran complejo a Zope, el framework con el que esta desarrollado el CMS.
Ahora, ¿qué tal si pudieras usar Plone solo como un gestor de contenidos y tu framework favorito, cualquiera sea, para implementar un front-end de forma transparente, obteniendo una configuración basada sobre una aplicación probada y de bajo mantenimiento, como backend siendo libre para escribir tu propia aplicación, usando el poder y flexibilidad de tu framework web?
En esta charla, se mostrarán ejemplos realizados con un par de productos de terceros de Plone y front-ends en varios frameworks.
CakePHP es un marco de desarrollo [framework] rápido para PHP, libre, de código abierto. Se trata
de una estructura que sirve de base a los programadores para que éstos puedan crear aplicaciones
Web. Nuestro principal objetivo es que puedas trabajar de forma estructurada y rápida, sin pérdida
de flexibilidad.
Con CakePHP el desarrollo web ya no es monótono porque ofrecemos las herramientas para que
empieces a escribir el código que realmente necesitas: la lógica específica de tu aplicación. Consigue
una copia de CakePHP, empieza con lo verdaderamente importante y no reinventes la rueda cada vez
que te incorpores a un nuevo proyecto.
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informáticavazquezgarciajesusma
En este proyecto de investigación nos adentraremos en el fascinante mundo de la intersección entre el arte y los medios de comunicación en el campo de la informática.
La rápida evolución de la tecnología ha llevado a una fusión cada vez más estrecha entre el arte y los medios digitales, generando nuevas formas de expresión y comunicación.
Continuando con el desarrollo de nuestro proyecto haremos uso del método inductivo porque organizamos nuestra investigación a la particular a lo general. El diseño metodológico del trabajo es no experimental y transversal ya que no existe manipulación deliberada de las variables ni de la situación, si no que se observa los fundamental y como se dan en su contestó natural para después analizarlos.
El diseño es transversal porque los datos se recolectan en un solo momento y su propósito es describir variables y analizar su interrelación, solo se desea saber la incidencia y el valor de uno o más variables, el diseño será descriptivo porque se requiere establecer relación entre dos o más de estás.
Mediante una encuesta recopilamos la información de este proyecto los alumnos tengan conocimiento de la evolución del arte y los medios de comunicación en la información y su importancia para la institución.
Actualmente, y debido al desarrollo tecnológico de campos como la informática y la electrónica, la mayoría de las bases de datos están en formato digital, siendo este un componente electrónico, por tanto se ha desarrollado y se ofrece un amplio rango de soluciones al problema del almacenamiento de datos.
Las lámparas de alta intensidad de descarga o lámparas de descarga de alta in...espinozaernesto427
Las lámparas de alta intensidad de descarga o lámparas de descarga de alta intensidad son un tipo de lámpara eléctrica de descarga de gas que produce luz por medio de un arco eléctrico entre electrodos de tungsteno alojados dentro de un tubo de alúmina o cuarzo moldeado translúcido o transparente.
lámparas más eficientes del mercado, debido a su menor consumo y por la cantidad de luz que emiten. Adquieren una vida útil de hasta 50.000 horas y no generan calor alguna. Si quieres cambiar la iluminación de tu hogar para hacerla mucho más eficiente, ¡esta es tu mejor opción!
Las nuevas lámparas de descarga de alta intensidad producen más luz visible por unidad de energía eléctrica consumida que las lámparas fluorescentes e incandescentes, ya que una mayor proporción de su radiación es luz visible, en contraste con la infrarroja. Sin embargo, la salida de lúmenes de la iluminación HID puede deteriorarse hasta en un 70% durante 10,000 horas de funcionamiento.
Muchos vehículos modernos usan bombillas HID para los principales sistemas de iluminación, aunque algunas aplicaciones ahora están pasando de bombillas HID a tecnología LED y láser.1 Modelos de lámparas van desde las típicas lámparas de 35 a 100 W de los autos, a las de más de 15 kW que se utilizan en los proyectores de cines IMAX.
Esta tecnología HID no es nueva y fue demostrada por primera vez por Francis Hauksbee en 1705. Lámpara de Nernst.
Lámpara incandescente.
Lámpara de descarga. Lámpara fluorescente. Lámpara fluorescente compacta. Lámpara de haluro metálico. Lámpara de vapor de sodio. Lámpara de vapor de mercurio. Lámpara de neón. Lámpara de deuterio. Lámpara xenón.
Lámpara LED.
Lámpara de plasma.
Flash (fotografía) Las lámparas de descarga de alta intensidad (HID) son un tipo de lámparas de descarga de gas muy utilizadas en la industria de la iluminación. Estas lámparas producen luz creando un arco eléctrico entre dos electrodos a través de un gas ionizado. Las lámparas HID son conocidas por su gran eficacia a la hora de convertir la electricidad en luz y por su larga vida útil.
A diferencia de las luces fluorescentes, que necesitan un recubrimiento de fósforo para emitir luz visible, las lámparas HID no necesitan ningún recubrimiento en el interior de sus tubos. El propio arco eléctrico emite luz visible. Sin embargo, algunas lámparas de halogenuros metálicos y muchas lámparas de vapor de mercurio tienen un recubrimiento de fósforo en el interior de la bombilla para mejorar el espectro luminoso y reproducción cromática. Las lámparas HID están disponibles en varias potencias, que van desde los 25 vatios de las lámparas de halogenuros metálicos autobalastradas y los 35 vatios de las lámparas de vapor de sodio de alta intensidad hasta los 1.000 vatios de las lámparas de vapor de mercurio y vapor de sodio de alta intensidad, e incluso hasta los 1.500 vatios de las lámparas de halogenuros metálicos.
Las lámparas HID requieren un equipo de control especial llamado balasto para funcionar
1. Bloque II: Patrones de diseño
1. ¿Qué son los patrones de diseño?
2. El patrón Singleton
3. El patrón Registry
4. El patrón Factory
5. El patrón Decorator
6. El patrón Observer
7. El patrón Front Controller
8. El patrón MVC
Desarrollo web avanzado con PHP5
2. Bloque II: Patrones de diseño
1. ¿Qué son los patrones de diseño?
2. El patrón Singleton
3. El patrón Registry
4. El patrón Factory
5. El patrón Decorator
6. El patrón Observer
7. El patrón Front Controller
8. El patrón MVC
Desarrollo web avanzado con PHP5
3. 2.1. ¿Qué son los patrones de diseño?
Son soluciones a problemas cotidianos, son independientes de la
tecnología utilizada y permiten crear un argot común.
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
4. 2.1. ¿Qué son los patrones de diseño?
Un poco de historia:
● En 1977 Christopher Alexander aplica en concepto de patrón
(“pattern”) a la arquitectura.
●En 1987 Kent Beck y Ward Cunningham se plantean aplicar
este concepto de patrón al sofware
●En 1994 se publica “Design Patterns: Elements of Reusable
Object-Oriented Software” por la Gang Of Four (Erich Gamma,
Richard Helm, Ralph Johnson, John Vlissides)
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
5. Bloque II: Patrones de diseño
1. ¿Qué son los patrones de diseño?
2. El patrón Singleton
3. El patrón Registry
4. El patrón Factory
5. El patrón Decorator
6. El patrón Observer
7. El patrón Front Controller
8. El patrón MVC
Desarrollo web avanzado con PHP5
6. 2.2. El patrón Singleton
Problema
Tener acceso a un recurso único que nunca sea duplicado y que
además esté disponible en cualquier parte de la aplicación, sin
tener que preocuparse de su existencia.
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
7. 2.2. El patrón Singleton
Ejemplo
Necesitar instanciar un objeto que nos de acceso a la base de
datos, pero que nos devuelva siempre la misma conexión.
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
8. 2.2. El patrón Singleton
Implementación
class DB{
private static $singleton;
private $connection;
private function __construct(){
$this>conection = mysql_connect();
}
public static function getInstance(){
if(is_null(self::$singleton){
self::$singleton = new DB();
}
return self::$singleton;
}
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
9. Bloque II: Patrones de diseño
1. ¿Qué son los patrones de diseño?
2. El patrón Singleton
3. El patrón Registry
4. El patrón Factory
5. El patrón Decorator
6. El patrón Observer
7. El patrón Front Controller
8. El patrón MVC
Desarrollo web avanzado con PHP5
10. 2.3. El patrón Registry
Problema
Permitir que cualquier objeto sea usado como un Singleton sin
necesidad de especificarlo directamente en su constructor
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
11. 2.3. El patrón Registry
Ejemplo
Crear un objeto que sea una base de datos que se pueda
recuperar como si fuera un singleton.
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
12. 2.3. El patrón Registry
Implementacion
class Registry{
private static $register;
public static function add($item){
if(is_object($item)){
$name = get_class($item);
}else{
throw new Exception('Objeto incorrecto');
}
self::$register[$name] = $item;
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
13. 2.3. El patrón Registry
Implementación (continuación)
public static function get($name){
if(array_key_exists($name, self::$register)){
return self::$register[$name];
}else{
throw new Exception('Clase no registrada');
}
}
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
14. Bloque II: Patrones de diseño
1. ¿Qué son los patrones de diseño?
2. El patrón Singleton
3. El patrón Registry
4. El patrón Factory
5. El patrón Decorator
6. El patrón Observer
7. El patrón Front Controller
8. El patrón MVC
Desarrollo web avanzado con PHP5
15. 2.4. El patrón Factory
Problema
Necesitamos instanciar una o más clases especializadas que se
encargan de hacer la misma tarea.
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
16. 2.4. El patrón Factory
Ejemplo
Necesitamos cargar los parámetros de configuración de nuestra
aplicación, pero estos podrán provenir de un XML o un archivo en
PHP.
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
17. 2.4. El patrón Factory
Solución
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
18. Bloque II: Patrones de diseño
1. ¿Qué son los patrones de diseño?
2. El patrón Singleton
3. El patrón Registry
4. El patrón Factory
5. El patrón Decorator
6. El patrón Observer
7. El patrón Front Controller
8. El patrón MVC
Desarrollo web avanzado con PHP5
19. 2.5. El patrón Decorator
Problema
Permitir herencia múltiple evitando que el árbol de clases crezca
de manera desmesurada.
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
20. 2.5. El patrón Decorator
Ejemplo
Estamos programando un juego de estrategia y creamos una
clase “Tile” (tesela) para el mapa. Cada tesela permite una
velocidad.
abstract class Tile{
abstract function getSpeed();
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
21. 2.5. El patrón Decorator
Ejemplo
Para crear una “Montaña” (Mountain) bastará con esto
class Mountain extends Tile{
private $speed = 10;
function getSpeed(){
return $this>speed;
}
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
22. 2.5. El patrón Decorator
Ejemplo
Y si queremos que la montaña esté congelada
class FrozenMountain extends Mountain{
function getSpeed(){
return parent::getSpeed() + 2;
}
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
23. 2.5. El patrón Decorator
Ejemplo
Y si ahora queremos que la montaña esté embarrada
class MuddyMountain extends class Mountain{
function getMoveRate(){
return parent::getSpeed() 2;
}
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
24. 2.5. El patrón Decorator
Ejemplo
Y si necesitamos una montaña embarrada y congelada
Y si ahora también tenemos explanadas
Y si también pueden estar atravesadas por ríos
...
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
25. 2.5. El patrón Decorator
Ejemplo
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
26. 2.5. El patrón Decorator
Implementación
El secreto para resolver correctamente este problema se basa en
delegar responsibilidades.
Seguimos manteniendo las primeras clases del árbol
class Mountain extends class Tile{
private $speed = 10;
function getMoveRate(){
return $this>speed;
}
abstract class Tile{
}
abstract function getSpeed();
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
27. 2.5. El patrón Decorator
Implementación
Creamos una nueva clase encargada de “decorar”
abstract class TileDecorator extends Tile{
protected $tile;
function __construct(Tile $tile){
$this>tile = $tile;
}
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
28. 2.5. El patrón Decorator
Implementación
Redefinimos nuestras clases “Congelada” y “Embarrada”
class MuddyDecorator extends TileDecorator{
function getSpeed(){
return $this>tile>getSpeed()2;
}
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
29. 2.5. El patrón Decorator
Implementación
Redefinimos nuestras clases “Congelada” y “Embarrada”
class FrozenDecorator extends TileDecorator{
function getSpeed(){
return $this>tile>getSpeed()+2;
}
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
30. 2.5. El patrón Decorator
Implementación
Creando una Montaña Congelada
$tile = new FrozenDecorator(
new Mountain()
);
return $title>getSpeed() // 12
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
31. 2.5. El patrón Decorator
Implementación
Creando una explanada congelada y embarrada
$tile = new MuddyDecorator(
new FrozenDecorator(
new Plain()
)
);
return $title>getSpeed() // 10
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
32. 2.5. El patrón Decorator
Implementación
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
33. Bloque II: Patrones de diseño
1. ¿Qué son los patrones de diseño?
2. El patrón Singleton
3. El patrón Registry
4. El patrón Factory
5. El patrón Decorator
6. El patrón Observer
7. El patrón Front Controller
8. El patrón MVC
Desarrollo web avanzado con PHP5
34. 2.6. El patrón Observer
Problema
Una clase adquiere responsabilidades que no le son específicas
como consecuencia de un evento que sucede en su interior
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
35. 2.6. El patrón Observer
Ejemplo
Consideremos una clase responsable del acceso de usuarios al
sistema
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
36. 2.6. El patrón Observer
Ejemplo
class Login{
const LOGIN_GRANTED = 1;
const LOGIN_DENIED = 2;
private $status = array();
public function handleLogin($user, $pass, $ip){
switch(rand(1,2)){
case 1:
$this>setStatus(self::LOGIN_GRANTED, $user, $ip);
$ret = true;
break;
case 2:
$this>setStatus(self::LOGIN_DENIED, $user, $ip);
$ret = false;
break;
}
return $ret;
}
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
37. 2.6. El patrón Observer
Ejemplo
La clase Login tendría además su correspondiente getter y setter
del atributo status
class Login{
// … codigo anterior
public function getStatus(){
return $this>status;
}
public function setStatus($status, $user, $ip){
$this>status = array($status, $user, $ip);
}
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
38. 2.6. El patrón Observer
Ejemplo
A las dos semanas de empezar a desarrollar el proyecto nos
hacen una ampliación de los requisitos
Necesitamos que cada vez que un usuario intente acceder al sistema se registre su
ip de acceso
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
39. 2.6. El patrón Observer
Ejemplo
class Login{
// … codigo
public function handleLogin($user, $pass, $ip){
switch(rand(1,2)){
// … código
}
Logger::logIP($user, $ip, $this>getStatus());
return $ret;
}
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
40. 2.6. El patrón Observer
Ejemplo
Un mes después, la ampliación de requisitos continúa
En caso de un intento de login fallido necesitamos que el sistema envíe un email
de notificación
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
41. 2.6. El patrón Observer
Ejemplo
class Login{
// … codigo
public function handleLogin($user, $pass, $ip){
switch(rand(1,2)){
// … código
}
Logger::logIP($user, $ip, $this>getStatus());
if(!$ret){
Notifier::mailWarning($user, $ip, $this>getStatus());
}
return $ret;
}
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
42. 2.6. El patrón Observer
Ejemplo
Tras quince días de calma, vuelven a solicitar nuevos cambios
Necesitamos añadir una cookie a aquellos usurios que sí que consigan acceder al
sistema.
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
43. 2.6. El patrón Observer
Implementación
Desenganchamos los elementos clientes (observadores) de la
clase central (observable o sujeto).
Los observadores son notificados por el sujeto de qué evento
tiene lugar
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
44. 2.6. El patrón Observer
Implementación
La interfaz “IObservable”
interface IObservable {
function attach(Observer $observer);
function detach(Observer $observer);
function notify();
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
45. 2.6. El patrón Observer
Implementación
class Observable implements IObservable {
private $observers;
function attach(Observer $observer){
$this>observers[] = $observer;
};
function detach(Observer $observer){
$key = array_search($this>observers, $observer);
unset($this>observers[$key]);
};
function notify(){
foreach($this>observers as $observer){
$observer>update($this);
}
}
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
46. 2.6. El patrón Observer
Implementación
La interfaz “IObserver”
interface IObserver {
function update(Observable $observable);
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
47. 2.6. El patrón Observer
Implementación
class Login extends Observable{
// … codigo
public function handleLogin($user, $pass, $ip){
switch(rand(1,2)){
// … código
}
$this>notify();
return $ret;
}
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
48. 2.6. El patrón Observer
Implementación
A las dos semanas de empezar a desarrollar el proyecto nos
hacen una ampliación de los requisitos
Necesitamos que cada vez que un usuario intente acceder al sistema se registre su
ip de acceso
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
49. 2.6. El patrón Observer
Implementación
class Logger implements Observer {
// otro código
function update(Observable $observable){
$this>log($observable>getStatus());
};
}
$login = new Login();
$login>attach(Logger::getInstance());
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
50. Bloque II: Patrones de diseño
1. ¿Qué son los patrones de diseño?
2. El patrón Singleton
3. El patrón Registry
4. El patrón Factory
5. El patrón Decorator
6. El patrón Observer
7. El patrón Front Controller
8. El patrón MVC
Desarrollo web avanzado con PHP5
51. 2.7. El patrón Front Controller
Problema
Proporcionar un único punto de entrada para todas las peticiones
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
52. 2.7. El patrón Front Controller
Solución
Todas las peticiones deben ser procesadas por un único script,
por ejemplo index.php
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
53. 2.7. El patrón Front Controller
Ejemplo
Tenemos una web muy simple formada por tres pantalla: Inicio,
Servicios y Contacto.
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
54. 2.7. El patrón Front Controller
Solución
// index.php
$page = isset($_GET['page'])?_GET['page']:'inicio';
include('pages/'.$page.'.php');
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
55. 2.7. El patrón Front Controller
URL Amigables
http://www.midominio.com/producto.php?id=1
vs
http://www.midominio.com/producto/mac-book-pro-13
nos conformaremos con
http://www.midominio.com/index.php?/producto/mac-book-pro-13
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
56. Bloque II: Patrones de diseño
1. ¿Qué son los patrones de diseño?
2. El patrón Singleton
3. El patrón Registry
4. El patrón Factory
5. El patrón Decorator
6. El patrón Observer
7. El patrón Front Controller
8. El patrón MVC
Desarrollo web avanzado con PHP5
57. 2.8. El patrón MVC
El patrón MVC para una aplicación web
Controlador
Responde a las
peticiones del usuario y
actuando de “pegamento”
entre modelo y vista
Vista
Muestra la información
del modelo, normalmente
Modelo HTML
Representa la
información sobre la que
opera la aplicación
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
58. 2.8. El patrón MVC
Un ejemplo, listando los artículos de un blog
<?php
// Conectando con la base de datos
try{
$dbh = new PDO(
'mysql:host=server.flai.es;dbname=curso_php_blog',
'curso',
'curso_2010');
echo "Conexion correcta";
}catch (Exception $e){
echo "Error: ".$e>getMessage();
die();
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
59. 2.8. El patrón MVC
Un ejemplo, listando los artículos de un blog
// Ejecutando la SQL
$stm = $dbh>prepare(
'SELECT title, created_at
FROM article
ORDER BY created_at
DESC LIMIT 10');
$stm>execute();
$results = $stm>fetchAll();
?>
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
60. 2.8. El patrón MVC
Un ejemplo, listando los artículos de un blog
<html>
<head>
<title>Listado de articulos</title>
</head>
<body>
<h1>Listado de articulos</h1>
<table>
<tr><th>Date</th><th>Title</th></tr>
<?php
foreach($results as $result)
{
echo "t<tr>n";
printf("tt<td> %s </td>n", $result['created_at']);
printf("tt<td> %s </td>n", $result['title']);
echo "t</tr>n";
}
?>
</table>
</body>
</html>
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
61. 2.8. El patrón MVC
Mejorando el código
try{
$dbh = new PDO('dsn';
}catch (Exception $e){
die("Error: ".$e>getMessage();
}
$stm = $dbh>prepare('SELECT * FROM article LIMIT 10');
$stm>execute();
$articles = $stm>fetchAll();
unset($dbh);
require('view.php');
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
62. 2.8. El patrón MVC
Mejorando el código (archivo view.php)
<html>
<head>
<title>Listado de artículos</title>
</head>
<body>
<h1>Listado de artículos</h1>
<table>
<tr><th>Fecha</th><th>Titulo</th></tr>
<?php foreach ($articles as $article): ?>
<tr>
<td><?php echo $article['created_at'] ?></td>
<td><?php echo $article['title'] ?></td>
</tr>
<?php endforeach; ?>
</table>
</body>
</html>
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
63. 2.8. El patrón MVC
Mejorando el código aún más (index.php)
<?php
require('model.php');
$articles = getAllArticles();
require('view.php');
?>
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño
64. 2.8. El patrón MVC
Mejorando el código aún más (model.php)
function connect($dsn){
try{
$dbh = new PDO($dsn);
}catch (Exception $e){
die("Error: ".$e>getMessage());
}
return $dbh;
}
function getAllArticles(){
$dbh = connect($dsn);
$stm = $dbh>prepare('SELECT * FROM article');
$stm>execute();
$articles = $stm>fetchAll();
unset($dbh);
return $articles;
}
Desarrollo web avanzado con PHP 5 Bloque II: Patrones de diseño