Создание Фрэймворка на PHP5 – Часть 1

Всё больше и больше нам приходится создавать динамических и интерактивных сайтов. Именно поэтому множество разработчиков начинают применять в своей работе различные фрэймворки. Существует немало хороших фрэймворков, однако собственный экземпляр может быть подстроен полностью под ваши нужды и значительно увеличить скорость разработки проекта, конечно же, если вы знаете, как с ним взаимодействовать. В этой небольшой серии уроков, мы покажем вам, как создать собственный фрэймворк на PHP5! В этом уроке мы начнём с планирования и закончим реализацией структуры.

*Заметка: при запуске демо вы должны увидеть “PCA Framework version 0.1 the HTML output”, что продемонстрирует успешную работу нашего приложения на первой стадии его разработки.

Шаг 1: Немного об этой серии уроков

В этой серии уроков мы будем создавать свой собственный фрэймворк на PHP5 с нуля. Он будет включать в себя все основные фишки системы управления контентом. Создавать мы его будем для нужд небольшой организации, ориентирующейся на веб разработку.

Данная серия уроков предназначена для системы, с помощью которой вы сможете создавать сайты. Ещё один плюс в том, что в последствии вам никто не будет мешать использовать данную систему в своих собственных целях и добавлять функционал.

В течении нескольких недель мы рассмотрим следующие темы:

  • Создание обработчика аутентификации, уровень абстракции базы данных и менеджер шаблонов
  • Объединение трёх объектов перечисленных выше воедино
  • Использование фрэймворка для управления содержимым сайта
  • Создание фантастического дизайна для лицевой и внутренней части сайта
  • Проектирование и реализация процесса входа в систему
  • Возможность расширения сконструированного фрэймворка

Шаг 2: Шаблоны проектирования и их использование в нашем фрэймворке

Когда речь идёт о создании какой-то крупной электронной системы, будь то десктоп программа или веб приложение, то всегда будет вставать ребром вопрос о том, какую архитектуру применить для её имплементации.

Шаблоны проектирования - это как раз то, к чему нужно обратиться при появлении подобной задачи. Для того чтобы подобрать необходимый шаблон для нашего проекта, нужно перебрать целую кучу подобных инструментов функциональной основы. Всё это нужно для того чтобы наша система была флексибильна! Ладно, больше не томлю! В этом уроке мы рассмотрим шаблоны проектирования под названием Singleton и Registry.

Шаг 3: Файлы и папки

Первое, что мы должны сделать, прежде чем приступим к реализации нашего фрэймворка, так это определиться с структурой каталогов, в которых будут храниться наши скрипты и прочие файлы. Мы готовим что-то вроде полигона, на котором будут располагаться наши войска. Большинство разработчиков используют следующие каталоги для подобных целей:

  • Каталог для хранения классов или файлов с функциями
  • Каталог для бизнес логики
  • Каталог для элементов дизайна

Для нас эта инфа - прекрасная отправная точка, потому как файлы, которые относятся к одной из этих 3х категорий, можно объединить в группы. Взгляните на структуру папок, которая приведена ниже. Чуть позже мы всё это детально обсудим.

Учтите, что каталоги .settings .project были созданы IDE, который я использую, и не претендуют на то, чтобы вы их создавали у себя

Базовые функции и объекты, такие как подключение к базе данных, аутентификация, обработчик шаблонов, объекты работающие с электронными сообщениями, объекты, обрабатывающие электронные сообщения, должны располагаться все вместе в каталоге objects, который в свою очередь располагается в папке PCARegistry. Это позволит нам отделить логику, относящуюся к Registry (по которому мы пробежимся вскользь) от самого объекта Registry.

Теперь нам надо определиться, в каком месте мы будем хранить файлы, отвечающие за бизнес-логику нашего фрэймворка. Пожалуй, папка controllers прекрасно подойдёт для этой цели. Каждый метод, являющийся с точки зрения приложения немаловажным (вывод бизнес списков, создание и управление данными, генератор всевозможных галерей и т.д.) будет представлять из себя отдельный контроллер. В этом уроке мы не собираемся ничего такого реализовывать, однако важно, чтобы вы понимали, для чего необходим данный каталог, таким образом, вы с лёгкостью сможете понять, как работает сам фрэймворк.

Элементы дизайна сайта и его шаблоны будут храниться в каталоге skins. Т.к. в перспективе мы хотим использовать несколько дизайнов (например, для того чтобы пользователи сами выбирали, в каком стиле они хотят видеть сайт, или различный дизайн в зависимости от времён года или в честь какого-то праздника), то каждый из этих шаблонов будет храниться в отдельном каталоге.

Шаг 4: Registry

Сердцевина нашего фрэймворка будет состоять из метода, взаимодействующего с базами данных, пользовательской авторизации и т.д. Имплементация шаблона проектирования Registry позволит нам хранить все эти методы централизованно, предоставляя лёгкий способ взаимодействия нашего фрэймворка с другими системами.

Шаблон проектирования Registry использует ссылки на объекты и в своём функционале очень похож на телефонную книгу, которая хранит и извлекает контактные данные. Этот механизм мы будем использовать, для того чтобы иметь доступ к объектам, настройкам системы, а также при необходимости передавать данные и другую информацию в любую часть приложения.

Поскольку мы будем хранить информацию централизованно, то нам понадобится только один единственный объект класса, который будет доступен из любой части приложения. Если не добиться такого эффекта, то это может привести к проблемам потери каких-то данных в самое неподходящее время. Для того чтобы решить эту проблему, наш объект Registry будет так имплементировать шаблон проектирования Singleton, который будет препятствовать появлению более одного объекта.

Ниже, в файле registry.class.php мы побыстренькому пройдёмся по тому, как это всё работает.

<?php
/**
 * Объект PCARegistry
 * Имплементация шаблонов проектирования Registry и Singleton
 *
 * @версия 0.1
*/
class PCARegistry {

    /**
     * Массив для объектов
     * @access private
     */
    private static $objects = array();

    /**
     * Массив для настроек
     * @access private
     */
    private static $settings = array();

    /**
     * Название фрэймворка понятное для человека
     * @access private
     */
    private static $frameworkName = 'PCA 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( 'Cloning the registry is not permitted', 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;
    }

}

?>

Итак, как же работает Registry?

Все объекты хранятся в массиве.

Когда в Registry передаётся новый объект, то автоматически подключается класс, где хранится функциональность данного объекта.

Доступ к данным объектам осуществляется при помощи “ключа” объекта, передаваемого в метод getObject.

Вы спросите: ну как же происходит предотвращение создания копии объекта Registry?

Наш конструктор имеет модификатор доступа private, для того чтобы предотвратить создание объекта класса напрямую.

Попытка клонировать объект приведёт к возникновению ошибки.

Если нам необходимо получить доступ к объекту в какой-то другой части нашего фрэймворка, или по какой-либо причине не можем достучаться к нему напрямую, мы можем использовать метод singleton ( PCARegistry::singleton() ) для получения экземпляра Registry.

Шаг 5: index.php

Перед тем как объяснить, каким образом мы будем приписывать функциональность в будущих уроках, давайте взглянем на то, как мы можем достучаться до Registry, и работать с нашим фрэймворком из одной точки – файла index.php.

ЧПУ или другими словами, человеко-понятные урлы можно встретить уже практически в любом веб приложении. Единственный способ реализации такого же эффекта, заключается в том, чтобы все запросы шли через файл index.php. В будущих уроках, мы создадим специальный файл .htaccess, для того чтобы любая часть нашего приложения перенаправляла пользователя на файл index.php.

Ниже вы можете увидеть код файла index.php. Конечно же это не вся его функциональность. Это то, что нужно нам на данный момент.

<?php
// Первое, что нужно сделать - начать сессию
session_start();

// определим некоторые константы
// такие как путь к корню нашего приложения
define( "APP_PATH", dirname( __FILE__ ) ."/" );
// а эту для того, чтобы убедиться, что скрипты не будут вызываться за пределами нашего фрэймворка
define( "PCAFW", true );

/**
 * Магическая функция autoload
 * используется для того чтобы подключить нужный нам контроллер
 * @param String название класса
 */
function __autoload( $class_name )
{
    require_once('controllers/' . $class_name . '/' . $class_name . '.php' );
}

// подключаем то, что создали ранее
require_once('PCARegistry/pcaregistry.class.php');
$registry = PCARegistry::singleton();

// выведем название фрэймворка, для того чтобы убедиться, что всё работает
print $registry->getFrameworkName();

exit();

?>

Итак…что же делает этот файл на данный момент?

  • Вызывает функцию start_session, для того чтобы мы могли получать доступ к необходимым данным из любой части фрэймворка (данную функцию нужно вызывать в самом начале файла)
  • Далее определяем константу, которая будет хранить путь к корневой части нашего фрэймворка, для того чтобы мы могли ссылаться на него из любой части приложения. В добавок создаём ещё одну константу для страховки, чтобы никакие посторонние скрипты не могли обращаться к нашим файлам.
  • Далее реализуем функцию autoload, для того чтобы определить, откуда подкачивать необходимые классы. В нашем случае, это путь к каталогу с контроллерами, поскольку именно там мы храним всю бизнес логику.
  • Потому мы подключаем класс, созданный в начале данного урока
  • В конце мы выводим название нашего фрэймворка, чтобы убедиться, что он находится в рабочем состоянии

На то, как работает объект Registry в нашем фрэймворке, мы создадим dummy класс. Мы можем это продемонстрировать благодаря классу template.class.php, который хранится в каталоге PCARegsitry/objects. Для этого необходимо добавить новый код в файл index.php.

После того, как мы создали $registry, можете вписать следующее:

$registry->storeObject('template','template');

Если в классе, который мы только что упомянули реализован метод generateOutput, то мы без особых затруднений можем вызывать его в index.php:

$registry->getObject('template')->generateOutput();

Теперь у нас есть хорошая основа, для того чтобы продолжить конструировать свой собственный фрэймворк. В следующем уроке мы продолжим строить нашу систему и создадим абстрактный слой для работы с базой данных и многое другое.

Источник: http://feedproxy.google.com/~r/ruseller/CdHX/~3/vc9bCsSniF0/lessons.php

Читать комменты и комментировать

Добавить комментарий / отзыв



Защитный код
Обновить

Создание Фрэймворка на PHP5 – Часть 1 | | 2012-06-19 12:10:15 | | Статьи Web-мастеру | | Всё больше и больше нам приходится создавать динамических и интерактивных сайтов. Именно поэтому множество разработчиков начинают применять в своей работе различные фрэймворки. Существует немало | РэдЛайн, создание сайта, заказать сайт, разработка сайтов, реклама в Интернете, продвижение, маркетинговые исследования, дизайн студия, веб дизайн, раскрутка сайта, создать сайт компании, сделать сайт, создание сайтов, изготовление сайта, обслуживание сайтов, изготовление сайтов, заказать интернет сайт, создать сайт, изготовить сайт, разработка сайта, web студия, создание веб сайта, поддержка сайта, сайт на заказ, сопровождение сайта, дизайн сайта, сайт под ключ, заказ сайта, реклама сайта, хостинг, регистрация доменов, хабаровск, краснодар, москва, комсомольск |
 
Поделиться с друзьями: