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