Съдържание

  1. Какво е glue?
  2. Необходими знания, инструменти …
  3. Цел: какво ще направим?
  4. Стартов пример
  5. Добавяне на обработка на изключения и страница за грешка.
  6. Структура на приложението.

Какво е glue?



Предстоящо събитие на потребителска група .NET

Secure your ASP.NET API using OAuth 2.0

Дата: 28 Февруари


 


В сравнение с разпространените php micro frameworks, glue едва ли може да се отнесе към тяхната категория. Вдъхновен от web.py, задачата му е бързо сервиране на страници, като съпоставя URL адреси към имена на класове. Адресът на проекта е http://gluephp.com.

Необходими знания, инструменти …

За удобство можете да използвате готовите пакети за разработка на web проекти като lamp или xamp. Това, което е необходимо, е работещ web сървър с възможност за работа с PHP на него. Естествено необходими са и минимални познания по php. Версията на php,която идва с lamp е достатъчна за нашите нужди, aз използвам PHP Version 5.5.6. В случая е важна заради константата __DIR__ , която не се поддържа в по-старите версии на PHP. Кодировката на файловете ни ще е UTF-8 без BOM.

Цел: какво ще направим?

Опростен сайт с различни секции: Начало, За сайта, Админ част. Така ще изградим директорийната структура на нашият php framework и ще напишем основните класове.

Стартов пример

Първо да задвижим glue. На сайта има много добра документация относно инсталирането и основната работа с glue (http://gluephp.com/documentation.html). Проблемът е, че тя предполага да работим в Document Root или в главната директория на локален виртуален сървър. В първия случай може да имате и други проекти в Document Root и да не желаете да се получава объркване с директориите, които ще създаваме, във втория трябва да настройване виртуален Apache сървър, което е встрани от темата. Така че, допълнителното, което ще направим, е да инсталираме GluePHP в поддиректория на нашия Document Root.

В Document Root създаваме директориите glue/app/system. От https://github.com/jtopjian/gluephp сваляме gluephp-master.zip и разархивираме някъде извън Document Root. Копираме glue.php под glue/app/system. Отваряме файла glue.php и изтриваме

  1. масива $urls
  2. класа page
  3. и реда glue::stick($urls);

В директорията glue създаваме файловете index.php и .htaccess. Отhttp://gluephp.com/documentation.html копираме съдържанието на .htaccess:

  1. RewriteEngine On
  2. RewriteCond %{REQUEST_FILENAME} !-f
  3. RewriteCond %{REQUEST_FILENAME} !-d
  4. RewriteRule . /index.php

Променяме само последния ред на:
RewriteRule . /glue/index.php

В index.php въвеждаме:

  1. require_once ‘app/system/glue.php’;
  2. //масива, в който указваме на кои url адреси, кои класове ще съпоставяме
  3. $urls = array(
  4.        ‘/glue/’ => ‘index’,
  5.        ‘/glue/(\d+)’ => ‘index’,
  6. );
  7. //самият клас
  8. class index {
  9.       function GET($matches) {
  10.              if (isset($matches[1]) && $matches[1]) {
  11.                  echo „The magic number is: „ . $matches[1];
  12.              } else {
  13.                     echo „You did not enter a number.“;
  14.              }
  15.       }
  16. }
  17. glue::stick($urls);

Сега да отворим с браузера адреса http://localhost/glue/ и виждаме съобщението:

You did not enter a number.

Поздравления стартирахме phpGlue!

Добавяне на обработка на изключения и страница за грешка.

Работата със страниците за грешки не са тривиални в някои php frameworks. Има много повдигнати теми по този въпрос във форумите на различните php frameworks. Следващата ни задача ще бъде да си прехванем изключенията.
Първо да добавим класа за прехващане на изклението за грешен url.
Отваряме glue.php и в края на файла добавяме:

  1.     class URLNotFound extends Exception {
  2.        public function __construct($message, $code = 0) {
  3.            parent::__construct($message, 404);
  4.        }
  5.        public function __toString() {
  6.            return __CLASS__ . „: [{$this->code}]: {$this->message}\n“;
  7.        }
  8.     }

а реда:

  1.     throw new Exception(„URL, $path, not found.“);

заместваме с:

  1.     throw new URLNotFound(„URL, $path, not found.“);

Сега нека въведем грешен url, например: http://localhost/glue/test
Ще видим, че класът ни се е задействал:

Fatal error: Uncaught URLNotFound: [404]: URL, /glue/test, not found. thrown in /opt/lampp/htdocs/glue/app/system/glue.php on line [some number]

Както виждаме, това съобщение не е достатъчно информативно за обикновения потребител. Затова отваряме index.php и реда:

  1.     glue::stick($urls);

заместваме с:

  1. try {
  2.      glue::stick($urls);
  3. } catch (URLNotFound $e) {
  4.       echo „URLNotFound error – „ . $e->getCode();
  5. }

По аналогичен начим можете да си направите класове и за останалите изключения.

Структура на приложението.

Да се върнем към файла index.php. Той съдържа класа index, който е типичен контролер. И така вече имаме нужда от някаква структура на приложението ни. Но вече започнахме да изграждаме такава – имаме директорията:
glue/app/system
Да създадем директорията:
glue/app/controllers
и в нея файла index.php.
Преместваме там класа index (от файла glue/index.php ).

Време е (за удобство) да добавим в glue/index.php някои константи, които ще се използват многократно по-нататък.

В glue/index.php, преди:

  1. require_once ‘app/system/glue.php’;

добавяме:

  1. define(‘BASE_URL’, ‘http://localhost/glue/’);
  2. // използваме php версия >= 5.5.6
  3. define(‘FULL_BASE_PATH’, __DIR__ . ‘/’);
  4. define(‘APPLICATION_PATH’, FULL_BASE_PATH . ‘app/’);
  5. define(‘CONTROLLERS_PATH’, APPLICATION_PATH . ‘controllers/’);
  6. define(‘SYSTEM_PATH’, APPLICATION_PATH . ‘system/’);

Да дефинираме и други полезни константи:

  1. define(‘ENCODING’, ‘utf8’);
  2. define(‘CHARSET’, ‘utf-8’);

Да определим часовата зона:

  1. date_default_timezone_set(‘Europe/Sofia’);

Да кажем каква кодова таблица използваме:

  1. header(‘Content-type: text/html; charset=UTF-8’);
  2. // вече имаме SYSTEM_PATH
  3. require_once SYSTEM_PATH.‘glue.php’;
  4. require_once CONTROLLERS_PATH.‘index.php’;

Сега например, ако променим реда (в index.php)

  1. echo „URLNotFound error – „ . $e->getCode();

на:

  1. echo „URLNotFound грешка – „ . $e->getCode();

и да въведем грешен url, например: http://localhost/glue/aaaaaaaaaa
Виждаме, че думата, изписана на кирилица, се чете правилно. При тази конструкция всичките ни дефинирани константи и настройки ще се виждат в контролерите, които от своя страна ще зареждат views, модели т.е. практически във всеки един файл от приложението ни.

С това приключва първа част.

Читателят може да обмисли възможността за зареждане на конролера при поискване.
Един примерен сайт, използващ phpGlue, може да видите на: http://jinnee.info/

Приятно кодиране 🙂

Автор: Янко Попов