1.4. Empezamos a escribir el framework MVC
Ya hemos descrito lo suficiente lo que debe tener nuestro framework, ahora es momento de implementarlo. Para comenzar, necesitas un servidor web. Puedes probar con Denwer, pero puede que tengas que actualizar PHP.
Puedes descargar Denwer con PHP 5.5.20 desde esta p谩gina:
https://drupalbook.org/ru/drupal/denwer-obnovlenie-php
o desde GitHub
https://github.com/levmyshkin/denwer-php-5.5.20
El funcionamiento de nuestro framework comenzar谩 desde el archivo index.php, que devuelve instancias desde el registro, llama al controlador necesario y le pasa los resultados del registro. El controlador, a su vez, puede llamar a los modelos que necesite.

Implementaci贸n de patrones
Existen varias maneras de implementar los patrones que hemos discutido. Nosotros elegiremos una de las posibles, y m谩s adelante puedes cambiar la implementaci贸n de alg煤n patr贸n si lo deseas.
Comencemos. En uno de los art铆culos anteriores analizamos la estructura de nuestro framework, as铆 que ahora debemos crear carpetas seg煤n esa estructura.
Ahora crea el archivo Registry/registry.class.php. En este archivo escribiremos la clase de nuestro registro.
<?php
/**
* Objeto de registro
* Implementa el patr贸n Registry y Singleton
*
*/
class Registry {
private static $objects = array();
private static $settings = array();
private static $frameworkName = 'Framework version 0.1';
private static $instance;
private function __construct() { }
public static function singleton()
{
if( !isset( self::$instance ) )
{
$obj = __CLASS__;
self::$instance = new $obj;
}
return self::$instance;
}
public function __clone()
{
trigger_error( 'Clonar el registro no est谩 permitido', E_USER_ERROR );
}
public function storeObject( $object, $key )
{
require_once('objects/' . $object . '.class.php');
self::$objects[ $key ] = new $object( self::$instance );
}
public function getObject( $key )
{
if( is_object ( self::$objects[ $key ] ) )
{
return self::$objects[ $key ];
}
}
public function storeSetting( $data, $key )
{
self::$settings[ $key ] = $data;
}
public function getSetting( $key )
{
return self::$settings[ $key ];
}
public function getFrameworkName()
{
return self::$frameworkName;
}
}
?>
驴C贸mo funciona nuestro Registro y c贸mo almacena objetos?
- Los objetos se almacenan como un array
- Cuando se a帽ade un nuevo objeto al registro, se incluye su archivo de clase, se instancia el objeto y se almacena en el array
- Los objetos se recuperan pasando su clave al m茅todo getObject
驴C贸mo se evita que se cree otra copia del objeto del registro?
- El constructor es privado, lo que impide que se cree el objeto directamente
- Clonar el objeto genera un error
- Si necesitas acceder al objeto de registro desde cualquier parte del framework y no puedes acceder directamente a 茅l, puedes usar el m茅todo est谩tico singleton (Registry::singleton()) para obtener la instancia del registro
Ahora que tenemos el Registro, escribamos index.php, que invocar谩 el funcionamiento del framework y acceder谩 al Registro.
Index.php
Index.php es el punto de entrada de nuestro framework.
M谩s adelante a帽adiremos la funcionalidad para generar URLs amigables (SEO) usando el archivo .htaccess. Por ahora, analicemos el c贸digo de index.php:
<?php
/**
* Framework
* Cargador del Framework - act煤a como 煤nico punto de acceso
*
*/
session_start();
define( "APP_PATH", dirname( __FILE__ ) ."/" );
define( "FW", true );
function __autoload( $class_name )
{
require_once('Controllers/' . $class_name . '/' . $class_name . '.php' );
}
require_once('Registry/registry.class.php');
$registry = Registry::singleton();
print $registry->getFrameworkName();
exit();
?>
Si todo es correcto, deber铆as ver el siguiente mensaje con el nombre de nuestro framework:
Framework version 0.1
Analicemos c贸mo funciona nuestro index.php actualmente:
- Se inicia una sesi贸n, lo que permite almacenar y acceder a datos desde cualquier parte del framework
- Definimos la carpeta ra铆z del framework, para que funcione correctamente incluso desde subcarpetas
- Cargamos controladores usando autoload
- Incluimos la clase del Registro
- Y mostramos el nombre del framework