Создаем свой фреймворк на компонентах symfony2. Часть 1.

Symfony2 — Это набор автономных, самостоятельных и легко интегрируемых между собой PHP компонентов, которые решают основные задачи web-разработки.

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

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

Зачем вам создавать собственный фреймворк?

Итак, зачем вам создавать собственный фреймворк? Если вы спросите — большинство людей скажут, что это плохо, что это изобретение велосипеда, что вам лучше выбрать один из уже существующих фреймворков и раз и на всегда забыть о создании собственного. Чаще всего — это правда. Однако, я могу придумать несколько причин для создания своего фреймворка:

  • Что бы больше узнать о низкоуровневой архитектуре современных фреймворков в общем, и о полноценном Synfony2 в частности;
  • Что бы создать фреймворк под ваши очень специфичные нужды (только убедитесь, что ваши нужды — действительно очень специфичные);
  • Поэкспериментировать с созданием фреймворка for fun (подход: выучил и выбросил);
  • Для рефакторинга старого приложения, которому не помешает хорошая доза современных best practices;
  • Что бы доказать миру, что вы способны создать фреймворк самостоятельно (… с небольшой поддержкой);

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

И конечно, каждый шаг — это случай, узнать больше о некоторых компонентах Symfony2.

Если у вас нет времени читать всю серию статей, или вы хотите поскорей начать, обратите внимание на Silex микро-фреймворк, основанный на компонентах Symfony2.

Многие современные фреймворки, называют себя MVC фреймворками. Мы не будем говорить об MVC, т.к. компоненты Symfony2 позволяют создать фремворк любого типа, не только с архитектурой MVC. Однако, если смотреть со стороны MVC — эта серия статей о том, как создать Контроллеры. Что касается Моделей и Представлений — это зависит от вашего личного вкуса, и вы можете использовать любые готовые сторонние библиотеки (Doctrine, Propel, или старый добрый PDO для моделей; PHP или Twig для представлений).

Создание фреймворка исходя из паттерна MVC — это неверная цель. Настоящая цель — разделение задач. Я считаю, что это единственный шаблон проектирования, о котором вы должны волноваться. Основной принцип компонентов Symfony2 — работа вокруг HTTP спецификации. Так что, фрейморк, который мы собираемся создать, правильнее будет назвать HTTP фреймворк, или фреймворк Запрос/Ответ.

Прежде чем начать

Просто прочитать статьи о создании фреймворка не достаточно. Вам необходимо прорабатывать представленные в статьях примеры кода. Для этого, нужно иметь современную версию PHP (5.3.8 или старше — будет достаточно), web сервер (Apache или NGinx), хорошие знания PHP и понимание принципов Объектно Ориентированного Программирования.

Готовы? Начнем!

Bootstrapping

Перед тем, как мы хотя бы подумаем о создании своего первого фреймворка, нам нужно поговорить о некоторых соглашениях: Где мы будем хранить наш код, как мы будем именовать наши классы, как мы будем разруливать внешние зависимости и т.д.

Для хранения вашего фреймворка, создайте директорию в файловой системе:

Coding Standards

Прежде чем кто-нибудь начнет холивар о стандартах оформления кода, и начнет объяснять, почему стандарты используемые в статье — отстой, давайте допустим, что это не так уж и важно, главное что есть хоть какие-то. В этой серии статей, мы будем использовать Symfony2 Coding Standards

Установка компонентов

Для установки компонентов Symfony2, которые мы будем использовать в нашем фреймворке, мы возьмем Composer, менеджер зависимостей для PHP. Для начала, перечислим наши зависимости в файле composer.json

Таким образом мы указываем, что наш проект зависит от компонента Symfony2 ClassLoader, версии 2.1.0 или выше. Что бы установить зависимости проекта, скачайте бинарный файл Composer, и запустите его:

После выполнения комманды install вы увидите новую директорию vendor которая содержит Symfony2 ClassLoader

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

Соглашение об именовании и Автолоадинг

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

Symfony2 следует PHP стандарту  PSR-0, для наименования классов и автозагрузки. Компонент Symfony2 ClassLoader предоставляет автозагрузчик, реализующий стандарт PSR-0, и обычно это все, что вам понадобится для автозагрузки классов вашего проекта.

Создайте пустой автозагрузчик в новом файле autoload.php

Теперь запустите autoload.php в консоли. Он не должен что-то делать или выводить какие-либо ошибки.

На сайте Symfony вы найдете больше информации о компоненте ClassLoader

Composer автоматически создаст автозагрузчик для всех ваших установленных зависимостей. Вместо использования компонента ClassLoader, вы также можете использовать файл  vendor/autoload.php

Наш проект

Вместо того, что бы создавать наш фремворк с нуля, мы будем писать одно и то же приложение, раз за разом добавляя по одной абстракции. Начнем с простейшего web-приложения, которое можно придумать для PHP.

На этом закончим первую часть. В следующий раз, мы познакомимся с компонентом HttpFoundation, и узнаем, что этот компонент может нам предложить.

К содержанию >>
Оригинал статьи на английском языке >>
Исходный код из статьи >>

Не забудьте поделиться статьей с друзьями

Подписывайтесь на меня в соц. сетях

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *