1.4. Pristupamo pisanju MVC-frameworka
Već smo dovoljno razradili šta treba da imamo u našem framework-u, vreme je da implementiramo naš framework. Za početak vam je potreban web server. Možete probati Denwer, ali možda ćete morati da ažurirate PHP.
Denwer sa PHP 5.5.20 možete preuzeti sa ove stranice:
https://drupalbook.org/ru/drupal/denwer-obnovlenie-php
ili sa GitHub-a:
https://github.com/levmyshkin/denwer-php-5.5.20
Rad našeg framework-a počinje fajlom index.php, koji vraća instance iz registra, poziva odgovarajući kontroler i prosleđuje mu rezultate registra. Kontroler potom može pozivati modele koji su mu potrebni.
Implementacija paterna
Postoji nekoliko načina da se implementiraju paterni koje smo diskutovali. Izabraćemo jedan od mogućih pristupa, a u budućnosti možete promeniti implementaciju nekog od paterna.
Hajde da počnemo. U jednom od prethodnih članaka smo razmotrili strukturu našeg framework-a, pa sada treba da kreiramo foldere u skladu sa tom strukturom.
Sada napravite fajl Registry/registry.class.php. U ovom fajlu ćemo napisati klasu našeg registra.
<?php /** * Objekt registra * Implementira patern Registar i Singleton klasu * */ class Registry { /** * Niz naših objekata * @access private */ private static $objects = array(); /** * Niz naših podešavanja * @access private */ private static $settings = array(); /** * Čitljivo ime našeg framework-a * @access private */ private static $frameworkName = 'Framework version 0.1'; /** * Instanca našeg registra * @access private */ private static $instance; /** * Konstruktor registra * @access private */ private function __construct() { } /** * Singleton metod za pristup objektu * @access public * @return */ public static function singleton() { if( !isset( self::$instance ) ) { $obj = __CLASS__; self::$instance = new $obj; } return self::$instance; } /** * Sprečava kloniranje objekta: baca grešku ako dođe do toga */ public function __clone() { trigger_error( 'Kloniranje registra nije dozvoljeno', E_USER_ERROR ); } /** * Čuva objekat u registru * @param String $object ime objekta * @param String $key ključ za niz * @return void */ public function storeObject( $object, $key ) { require_once('objects/' . $object . '.class.php'); self::$objects[ $key ] = new $object( self::$instance ); } /** * Dohvata objekat iz registra * @param String $key ključ niza * @return object */ public function getObject( $key ) { if( is_object ( self::$objects[ $key ] ) ) { return self::$objects[ $key ]; } } /** * Čuva podešavanja registra * @param String $data * @param String $key ključ niza * @return void */ public function storeSetting( $data, $key ) { self::$settings[ $key ] = $data; } /** * Dohvata podešavanja registra * @param String $key ključ niza * @return void */ public function getSetting( $key ) { return self::$settings[ $key ]; } /** * Dohvata ime framework-a * @return String */ public function getFrameworkName() { return self::$frameworkName; } } ?>
Kako naš Registar radi i kako čuva naše objekte?
- Objekti se čuvaju u nizu
- Kada se novi objekat doda u registar, fajl klase se učitava, kreira se instanca objekta i dodaje u niz
- Objekat se vraća pozivom getObject metode sa odgovarajućim ključem
Kako se sprečava kreiranje druge instance registra?
- Konstruktor je privatni, što onemogućava direktno kreiranje objekta
- Kloniranje objekta baca grešku
- Ako želite da pristupite registru iz bilo kog dela framework-a, a nemate instancu, koristite statički metod singleton (Registry::singleton()) da dobijete instancu registra
Sada kada imamo Registar, napišimo index.php koji će pokretati framework i pristupati Registru.
Index.php
Index.php je početna tačka našeg framework-a.
Kasnije ćemo dodati mogućnost za čitljive URL-ove (ČPU) putem .htaccess fajla. Za sada hajde da pogledamo kod index.php:
<?php /** * Framework * Loader framework-a - centralna tačka pristupa framework-u * */ // pokrećemo sesiju session_start(); // definišemo konstante // Definišemo korenski folder framework-a da bismo mogli lako da ga koristimo u bilo kom skriptu define( "APP_PATH", dirname( __FILE__ ) ."/" ); // Koristićemo ovu konstantu da sprečimo pozivanje skripti van našeg framework-a define( "FW", true ); /** * Magična metoda za automatsko učitavanje klasa * Omogućava pozivanje potrebnog kontrolera kada je potrebno * @param String ime klase */ function __autoload( $class_name ) { require_once('Controllers/' . $class_name . '/' . $class_name . '.php' ); } // učitavamo naš registar require_once('Registry/registry.class.php'); $registry = Registry::singleton(); // prikazujemo ime framework-a da proverimo da li sve radi print $registry->getFrameworkName(); exit(); ?>
Ako je sve u redu, biće prikazan tekst sa imenom našeg framework-a:
Framework version 0.1
Kako index.php trenutno funkcioniše:
- Pokreće sesiju da bismo mogli čuvati i dobijati podatke u bilo kom delu framework-a
- Definiše korenski folder framework-a, što omogućava rad i ako framework nije u korenu sajta
- Učitava kontrolere pomoću automatskog učitavanja
- Učitava klasu registra
- Prikazuje ime framework-a