1.4. Սկսում ենք MVC ֆրեյմվորկի ստեղծումը
Մենք արդեն բավականին մանրամասն նկարագրել ենք, թե ինչ պետք է ունենա մեր ֆրեյմվորկը, ուստի ժամանակն է սկսել այն իրականացնել։ Սկզբի համար ձեզ անհրաժեշտ է վեբ սերվեր։ Կարող եք փորձել Denwer-ը, սակայն հնարավոր է՝ ստիպված լինեք թարմացնել PHP-ն։
Denwer-ը PHP 5.5.20 տարբերակով կարող եք ներբեռնել այս էջից․
https://drupalbook.org/ru/drupal/denwer-obnovlenie-php
կամ GitHub-ից՝
https://github.com/levmyshkin/denwer-php-5.5.20
Մեր ֆրեյմվորկի աշխատանքը կսկսվի index.php
ֆայլից, որը վերադարձնում է օբյեկտներ ռեեստրից, կանչում է անհրաժեշտ controller-ը և փոխանցում է նրան ռեեստրի արդյունքները։ Controller-ը կարող է իր հերթին կանչել անհրաժեշտ մոդելները։
Պատերնների իրականացում
Կա մի քանի եղանակ՝ վերոնշյալ պատերնները (patterns) իրականացնելու համար։ Մենք կընտրենք դրանցից մեկը, իսկ ապագայում կարող եք այն փոխել՝ ըստ անհրաժեշտության։
Սկսենք։ Նախորդ հոդվածում մենք ուսումնասիրել էինք մեր ֆրեյմվորկի կառուցվածքը, ուստի այժմ պետք է ստեղծել պանակներ՝ ըստ այդ կառուցվածքի։
Այժմ ստեղծեք Registry/registry.class.php
ֆայլը։ Այս ֆայլում մենք կգրենք մեր ռեեստրի դասը։
<?php /** * Ռեեստրի օբյեկտ * Իրականացնում է Ռեեստրի և Singleton-ի պատերնները * */ class Registry { /** * Մեր օբյեկտների զանգվածը * @access private */ private static $objects = array(); /** * Մեր կարգավորումների զանգվածը * @access private */ private static $settings = array(); /** * Մեր ֆրեյմվորկի ընթեռնելի անվանումը * @access private */ private static $frameworkName = 'Framework version 0.1'; /** * Ռեեստրի միակ օրինակը * @access private */ private static $instance; /** * Ռեեստրի կոնստրուկտորը * @access private */ private function __construct() { } /** * Singleton մեթոդ՝ ռեեստրին հասանելիություն ստանալու համար * @access public * @return */ public static function singleton() { if( !isset( self::$instance ) ) { $obj = __CLASS__; self::$instance = new $obj; } return self::$instance; } /** * Կլոնավորման կանխարգելում */ public function __clone() { trigger_error( 'Ռեեստրի կլոնավորումը արգելված է', E_USER_ERROR ); } /** * Պահպանում է օբյեկտը ռեեստրում * @param String $object օբյեկտի անունը * @param String $key զանգվածի բանալի * @return void */ public function storeObject( $object, $key ) { require_once('objects/' . $object . '.class.php'); self::$objects[ $key ] = new $object( self::$instance ); } /** * Վերադարձնում է օբյեկտ ռեեստրից * @param String $key զանգվածի բանալի * @return object */ public function getObject( $key ) { if( is_object ( self::$objects[ $key ] ) ) { return self::$objects[ $key ]; } } /** * Պահպանում է կարգավորումները ռեեստրում * @param String $data * @param String $key զանգվածի բանալի * @return void */ public function storeSetting( $data, $key ) { self::$settings[ $key ] = $data; } /** * Վերադարձնում է կարգավորումը ռեեստրից * @param String $key բանալի * @return void */ public function getSetting( $key ) { return self::$settings[ $key ]; } /** * Վերադարձնում է ֆրեյմվորկի անունը * @return String */ public function getFrameworkName() { return self::$frameworkName; } } ?>
Իսկ ինչպե՞ս է աշխատում մեր ռեեստրն ու ինչպես է պահում օբյեկտները։
- Օբյեկտները պահվում են զանգվածում
- Երբ նոր օբյեկտ է ավելացվում, համապատասխան ֆայլը ներմուծվում է, ստեղծվում է օբյեկտը և դրվում զանգվածում
- Օբյեկտները վերադարձվում են
getObject
մեթոդի միջոցով՝ բանալիով
Ի՞նչն է կանխում ռեեստրի այլ օրինակ ստեղծելը։
- Կոնստրուկտորը
private
է - Կլոնավորումը կբերի սխալի
- Եթե անհրաժեշտ է օգտվել ռեեստրից այլ ֆայլից, կարող եք օգտվել
singleton()
մեթոդից՝Registry::singleton()
Այժմ, երբ ունենք ռեեստրի դասը, եկեք գրենք index.php
, որը կգործարկի ֆրեյմվորկը և կմիանա ռեեստրին։
Index.php
Index.php
ֆայլը մեր ֆրեյմվորկի մուտքի կետն է։
Հետագայում ավելացնենք նաև .htaccess ֆայլ՝ ՉՊՈւ (չարդարացված պիտանի URL) հնարավորության համար։ Իսկ հիմա դիտարկենք index.php
-ի կոդը՝
<?php /** * Framework * Framework loader - ֆրեյմվորկի մուտքի միակ կետը */ // Սկսում ենք session-ը session_start(); // Սահմանում ենք հաստատուններ define( "APP_PATH", dirname( __FILE__ ) ."/" ); define( "FW", true ); /** * Autoload ֆունկցիա՝ անհրաժեշտ controller-ները ավտոմատ ներմուծելու համար */ 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(); ?>
Եթե ամեն ինչ ճիշտ է, ապա պետք է տեսնեք հետևյալ արդյունքը՝
Framework version 0.1
Դիտարկենք index.php
-ի ընթացիկ աշխատանքը․
- Սկսվում է session
- Սահմանվում է ֆրեյմվորկի ճանապարհը
- Սահմանվում է
FW
հաստատուն՝ սցենարների անվտանգ կանչի համար - Կազմակերպվում է ավտոմատ բեռնում controller-ների
- Ներմուծվում է ռեեստրի դասը
- Տպվում է ֆրեյմվորկի անունը