PHP Avanzado: Patrones de diseño
-
Upload
rightster -
Category
Technology
-
view
19.667 -
download
1
description
Transcript of PHP Avanzado: Patrones de diseño
![Page 1: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/1.jpg)
Desarrollo web avanzado con PHP5
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
![Page 2: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/2.jpg)
Desarrollo web avanzado con PHP5
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
![Page 3: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/3.jpg)
Desarrollo web avanzado con PHP 5
2.1. ¿Qué son los patrones de diseño?
Bloque II: Patrones de diseño
Son soluciones a problemas cotidianos, son independientes de la tecnología utilizada y permiten crear un argot común.
![Page 4: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/4.jpg)
Desarrollo web avanzado con PHP 5
2.1. ¿Qué son los patrones de diseño?
Bloque II: 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)
![Page 5: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/5.jpg)
Desarrollo web avanzado con PHP5
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
![Page 6: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/6.jpg)
Desarrollo web avanzado con PHP 5
2.2. El patrón Singleton
Bloque II: Patrones de diseño
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.
![Page 7: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/7.jpg)
Desarrollo web avanzado con PHP 5
2.2. El patrón Singleton
Bloque II: Patrones de diseño
Ejemplo
Necesitar instanciar un objeto que nos de acceso a la base de datos, pero que nos devuelva siempre la misma conexión.
![Page 8: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/8.jpg)
Desarrollo web avanzado con PHP 5
2.2. El patrón Singleton
Bloque II: Patrones de diseño
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; }}
![Page 9: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/9.jpg)
Desarrollo web avanzado con PHP5
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
![Page 10: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/10.jpg)
Desarrollo web avanzado con PHP 5
2.3. El patrón Registry
Bloque II: Patrones de diseño
Problema
Permitir que cualquier objeto sea usado como un Singleton sin necesidad de especificarlo directamente en su constructor
![Page 11: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/11.jpg)
Desarrollo web avanzado con PHP 5
2.3. El patrón Registry
Bloque II: Patrones de diseño
Ejemplo
Crear un objeto que sea una base de datos que se pueda recuperar como si fuera un singleton.
![Page 12: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/12.jpg)
Desarrollo web avanzado con PHP 5
2.3. El patrón Registry
Bloque II: Patrones de diseño
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; }
![Page 13: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/13.jpg)
Desarrollo web avanzado con PHP 5
2.3. El patrón Registry
Bloque II: Patrones de diseño
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');
} }}
![Page 14: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/14.jpg)
Desarrollo web avanzado con PHP5
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
![Page 15: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/15.jpg)
Desarrollo web avanzado con PHP 5
2.4. El patrón Factory
Bloque II: Patrones de diseño
Problema
Necesitamos instanciar una o más clases especializadas que se encargan de hacer la misma tarea.
![Page 16: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/16.jpg)
Desarrollo web avanzado con PHP 5
2.4. El patrón Factory
Bloque II: Patrones de diseño
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.
![Page 17: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/17.jpg)
Desarrollo web avanzado con PHP 5
2.4. El patrón Factory
Bloque II: Patrones de diseño
Solución
![Page 18: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/18.jpg)
Desarrollo web avanzado con PHP5
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
![Page 19: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/19.jpg)
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Problema
Permitir herencia múltiple evitando que el árbol de clases crezca de manera desmesurada.
![Page 20: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/20.jpg)
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
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();}
![Page 21: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/21.jpg)
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Ejemplo
Para crear una “Montaña” (Mountain) bastará con esto
class Mountain extends Tile{ private $speed = 10;
function getSpeed(){return $this>speed;
}}
![Page 22: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/22.jpg)
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Ejemplo
Y si queremos que la montaña esté congelada
class FrozenMountain extends Mountain{
function getSpeed(){return parent::getSpeed() + 2;
}}
![Page 23: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/23.jpg)
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Ejemplo
Y si ahora queremos que la montaña esté embarrada
class MuddyMountain extends class Mountain{
function getMoveRate(){return parent::getSpeed() 2;
}}
![Page 24: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/24.jpg)
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
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
...
![Page 25: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/25.jpg)
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Ejemplo
![Page 26: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/26.jpg)
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
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();}
![Page 27: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/27.jpg)
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Implementación
Creamos una nueva clase encargada de “decorar”
abstract class TileDecorator extends Tile{
protected $tile;
function __construct(Tile $tile){$this>tile = $tile;
}}
![Page 28: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/28.jpg)
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Implementación
Redefinimos nuestras clases “Congelada” y “Embarrada”
class MuddyDecorator extends TileDecorator{
function getSpeed(){return $this>tile>getSpeed()2;
}}
![Page 29: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/29.jpg)
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Implementación
Redefinimos nuestras clases “Congelada” y “Embarrada”
class FrozenDecorator extends TileDecorator{
function getSpeed(){return $this>tile>getSpeed()+2;
}}
![Page 30: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/30.jpg)
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Implementación
Creando una Montaña Congelada
$tile = new FrozenDecorator( new Mountain() );
return $title>getSpeed() // 12
![Page 31: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/31.jpg)
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Implementación
Creando una explanada congelada y embarrada
$tile = new MuddyDecorator( new FrozenDecorator( new Plain() ) );
return $title>getSpeed() // 10
![Page 32: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/32.jpg)
Desarrollo web avanzado con PHP 5
2.5. El patrón Decorator
Bloque II: Patrones de diseño
Implementación
![Page 33: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/33.jpg)
Desarrollo web avanzado con PHP5
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
![Page 34: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/34.jpg)
Desarrollo web avanzado con PHP 5
2.6. El patrón Observer
Bloque II: Patrones de diseño
Problema
Una clase adquiere responsabilidades que no le son específicas como consecuencia de un evento que sucede en su interior
![Page 35: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/35.jpg)
Desarrollo web avanzado con PHP 5
2.6. El patrón Observer
Bloque II: Patrones de diseño
Ejemplo
Consideremos una clase responsable del acceso de usuarios al sistema
![Page 36: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/36.jpg)
Desarrollo web avanzado con PHP 5
2.6. El patrón Observer
Bloque II: Patrones de diseño
Ejemploclass 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; }}
![Page 37: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/37.jpg)
Desarrollo web avanzado con PHP 5
2.6. El patrón Observer
Bloque II: Patrones de diseño
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);
}}
![Page 38: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/38.jpg)
Desarrollo web avanzado con PHP 5
2.6. El patrón Observer
Bloque II: Patrones de diseño
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
![Page 39: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/39.jpg)
Desarrollo web avanzado con PHP 5
2.6. El patrón Observer
Bloque II: Patrones de diseño
Ejemplo
class Login{
// … codigo
public function handleLogin($user, $pass, $ip){switch(rand(1,2)){
// … código }
Logger::logIP($user, $ip, $this>getStatus());
return $ret; }}
![Page 40: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/40.jpg)
Desarrollo web avanzado con PHP 5
2.6. El patrón Observer
Bloque II: Patrones de diseño
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
![Page 41: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/41.jpg)
Desarrollo web avanzado con PHP 5
2.6. El patrón Observer
Bloque II: Patrones de diseño
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; }}
![Page 42: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/42.jpg)
Desarrollo web avanzado con PHP 5
2.6. El patrón Observer
Bloque II: Patrones de diseño
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.
![Page 43: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/43.jpg)
Desarrollo web avanzado con PHP 5
2.6. El patrón Observer
Bloque II: Patrones de diseño
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
![Page 44: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/44.jpg)
Desarrollo web avanzado con PHP 5
2.6. El patrón Observer
Bloque II: Patrones de diseño
Implementación
La interfaz “IObservable”
interface IObservable {
function attach(Observer $observer);
function detach(Observer $observer);
function notify();
}
![Page 45: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/45.jpg)
Desarrollo web avanzado con PHP 5
2.6. El patrón Observer
Bloque II: Patrones de diseño
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); } }}
![Page 46: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/46.jpg)
Desarrollo web avanzado con PHP 5
2.6. El patrón Observer
Bloque II: Patrones de diseño
Implementación
La interfaz “IObserver”
interface IObserver {
function update(Observable $observable);
}
![Page 47: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/47.jpg)
Desarrollo web avanzado con PHP 5
2.6. El patrón Observer
Bloque II: Patrones de diseño
Implementación
class Login extends Observable{ // … codigo public function handleLogin($user, $pass, $ip){ switch(rand(1,2)){
// … código }
$this>notify();
return $ret; }}
![Page 48: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/48.jpg)
Desarrollo web avanzado con PHP 5
2.6. El patrón Observer
Bloque II: Patrones de diseño
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
![Page 49: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/49.jpg)
Desarrollo web avanzado con PHP 5
2.6. El patrón Observer
Bloque II: Patrones de diseño
Implementación
class Logger implements Observer {
// otro código
function update(Observable $observable){ $this>log($observable>getStatus()); };
}
$login = new Login();$login>attach(Logger::getInstance());
![Page 50: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/50.jpg)
Desarrollo web avanzado con PHP5
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
![Page 51: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/51.jpg)
Desarrollo web avanzado con PHP 5
2.7. El patrón Front Controller
Bloque II: Patrones de diseño
Problema
Proporcionar un único punto de entrada para todas las peticiones
![Page 52: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/52.jpg)
Desarrollo web avanzado con PHP 5
2.7. El patrón Front Controller
Bloque II: Patrones de diseño
Solución
Todas las peticiones deben ser procesadas por un único script, por ejemplo index.php
![Page 53: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/53.jpg)
Desarrollo web avanzado con PHP 5
2.7. El patrón Front Controller
Bloque II: Patrones de diseño
Ejemplo
Tenemos una web muy simple formada por tres pantalla: Inicio, Servicios y Contacto.
![Page 54: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/54.jpg)
Desarrollo web avanzado con PHP 5
2.7. El patrón Front Controller
Bloque II: Patrones de diseño
Solución
// index.php$page = isset($_GET['page'])?_GET['page']:'inicio';
include('pages/'.$page.'.php');
![Page 55: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/55.jpg)
Desarrollo web avanzado con PHP 5
2.7. El patrón Front Controller
Bloque II: Patrones de diseño
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
![Page 56: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/56.jpg)
Desarrollo web avanzado con PHP5
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
![Page 57: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/57.jpg)
Desarrollo web avanzado con PHP 5
2.8. El patrón MVC
Bloque II: Patrones de diseño
El patrón MVC para una aplicación web
ModeloRepresenta la información sobre la que opera la aplicación
VistaMuestra la información del modelo, normalmente HTML
ControladorResponde a las peticiones del usuario y actuando de “pegamento” entre modelo y vista
![Page 58: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/58.jpg)
Desarrollo web avanzado con PHP 5
2.8. El patrón MVC
Bloque II: Patrones de diseño
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();
}
![Page 59: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/59.jpg)
Desarrollo web avanzado con PHP 5
2.8. El patrón MVC
Bloque II: Patrones de diseño
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();
?>
![Page 60: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/60.jpg)
Desarrollo web avanzado con PHP 5
2.8. El patrón MVC
Bloque II: Patrones de diseño
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("\t\t<td> %s </td>\n", $result['created_at']); printf("\t\t<td> %s </td>\n", $result['title']); echo "\t</tr>\n"; } ?> </table> </body> </html>
![Page 61: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/61.jpg)
Desarrollo web avanzado con PHP 5
2.8. El patrón MVC
Bloque II: Patrones de diseño
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');
![Page 62: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/62.jpg)
Desarrollo web avanzado con PHP 5
2.8. El patrón MVC
Bloque II: Patrones de diseño
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>
![Page 63: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/63.jpg)
Desarrollo web avanzado con PHP 5
2.8. El patrón MVC
Bloque II: Patrones de diseño
Mejorando el código aún más (index.php)
<?php
require('model.php');
$articles = getAllArticles();
require('view.php');
?>
![Page 64: PHP Avanzado: Patrones de diseño](https://reader034.fdocuments.co/reader034/viewer/2022042607/557accccd8b42add288b4a0f/html5/thumbnails/64.jpg)
Desarrollo web avanzado con PHP 5
2.8. El patrón MVC
Bloque II: Patrones de diseño
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;}