Создаем собственный фреймворк на основе Symfony2. (Часть 1)

Original author: Fabien Potencier
  • Translation
Оглавление


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

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

Зачем вам нужен собственный фреймворк? (Why would you like to create your own framework?)



Во-первых, почему вы хотите создать собственный фреймворк? Ведь, если посмотреть, все вам скажут, что не стоит изобретать велосипед, а использовать уже готовое решение. И в большинстве случаев они будут правы, но есть несколько причин что бы начать разработку своего фреймворка:

  1. Что бы изучить низкоуровневую архитектуру современных веб-ориентированных фреймворков, в частности Symfony2 и ее компонентов.
  2. Что бы создать фремворк «под ключ» для ваших специфических нужд. (Только прежде убедитесь, что ваши нужды действительно специфические)
  3. Для эксперимента ради удовольствия ( научился и забил )
  4. Для рефакторинга уже существующих приложений, которые нуждаются в более современных и устоявшихся практических решениях.
  5. Что бы доказать что вы это можете (… пусть и с небольшой помощью)


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

И конечно же, на каждом шаге вы будете узнавать больше про Symfony2 и ее компоненты.

  • Если у вас нет времени для прочтения полного цикла статей, или вы хотите приступить к разработке уже сейчас, обратите свое внимание на Silex, это микро-фреймворк основанный на компонентах Symfony2.


Много современных фремворков базируют себя как MVC фреймворки. В этой серии статей мы не будем обсуждать MVC-модель, так как на основе компонентов Symfony2 вы можете создать фреймоворк не основанный на этой модели. Во-всяком случае, если вы посмотрите на построение MVC — эта часть будет про то, как создать часть Contoller'а в данной архитектуре.
Для Model и View все зависит от ваших предпочтений и я даю возможность вам использовать любые библиотеки (например: Doctrine, Propel или старый добрый PDO для Model и/или PHP, Twig для View).

При создании фреймворка, основная цель должна быть — разделение на компоненты, нежели слепое следование паттерну MVC. Фундаментальные принципы компонентов Symfony2 основаны на спецификации HTTP протокола. Так и создаваемый нами фреймворк более точно называется HTTP-фреймворк или Request/Response-фреймоворк.

Прежде чем начнем (Before we start)



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

Ну что, готовы? Тогда начнем.

Начальная загрузка (Bootstrapping)



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

Для размещения фреймворка создайте директорию где-то на вашем сервере:
mkdir framework
cd framework


Стандарты написания кода (Coding Standards)


Перед тем как кто-то начнет холивор по поводу этого, давайте признаем что для примера совершенно не принципиально какие стандарты использовать. Поэтому в серии этих статей мы будем применять «Symfony2 Coding Standards».

Установка компонентов (Components Installation)


Для установки необходимых компонентов нашего фреймворка мы будем использовать Composer, менеджер зависимостей проекта для PHP. Первый вариант, который мы опишем в composer.json, будет выглядеть так:
{
    "require": {
        "symfony/class-loader": "2.1.*"
    }
}


Здесь мы объявляем что наш проект использует компонент Symfony2 ClassLoader версии 2.1.0 или выше. Что бы загрузить и установить зависимости проекта выполним следующее:
$ wget http://getcomposer.org/composer.phar
$ # or
$ curl -O http://getcomposer.org/composer.phar

$ php composer.phar install


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

  • Я рекомендую использовать вам Composer, хотя вы можете скачать архивированный компонент или использовать Git submodules. Решать вам.


Именование и Автозагрузка (Naming Conventions and Autoloading)



Мы будем применять autoload для всех наших классов. Без автозагрузки вам придется делать require нужного файла перед использованием его функционала. Но сейчас мы дадим PHP делать это за нас.
Symfony2 следует стандартам де-факто для PHP, в частности PSR-0, для именования классов и автозагрузчика. Компонент Symfony2 ClassLoader обеспечивает стандарт PSR-0 и в большинстве случаев все что вам нужно — это загрузить этот компонент.
Создайте пустой менеджер автозагрузки в файле: autoload.php:
<?php
 
// framework/autoload.php
 
require_once __DIR__.'/vendor/symfony/class-loader/Symfony/Component/ClassLoader/UniversalClassLoader.php';
 
use Symfony\Component\ClassLoader\UniversalClassLoader;
 
$loader = new UniversalClassLoader();
$loader->register();

Сейчас вы можете выполнить этот файл с помощью консоли, он не выполняет никаких действий и не должен выдавать ошибку(-и):
$ php autoload.php

  • Вы можете больше узнать о компоненте ClassLoader на сайте Symfony2.

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

Наш проект


Вместо создания фреймворка с шаблона мы будем писать простейшее приложение снова и снова, добавляя по одному уровню абстракции каждый раз. Начнем с простейшего web-приложения на PHP:
<?php
 
$input = $_GET['name'];
 
printf('Hello %s', $input);

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

Отдельное спасибо юзеру 1nf за помощь в переводе.
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 29

    +4
    Для подсветки PHP используйте <source lang="php"><?php echo "hello"; ?></source>.

    А так, спасибо за наводку.
      0
      Уже поправил, спасибо.
        +1
        И как-то у вас $_GET<'name'> вместо $_GET['name']

        Интересно, Фабиен сам понял, что Symfony2 больше подходит для создания фреймворков/CMS и прочих тиражируемых и/или тяжелых решений, чем для «быстрого старта» или подсказал кто? На хабре это как-то обсуждалось :)
          0
          И как-то у вас $_GET<'name'> вместо $_GET['name']

          Так было в оригинале, и в комментариях это говорили,. В своем посте он не исправил. Но я взял на себя смелость исправить это в переводе(После вашего замечания, за что благодарен).
      0
      Очень интересная тема, подумываю над аналогичной заточкой Yii под свои узко-специализированные нужды!
        0
        Был бы рад почитать про подобную вещь на Yii, сам не юзал но довольно наслышан. Может статейку напишите?)
          0
          Кармы не хватит)
            0
            А мы поможем, чем сможем.
        • UFO just landed and posted this here
        • UFO just landed and posted this here
            +1
            А вот тут есть отличный перевод документации Symfony. Жаль, что я это не нашёл, когда сам симфони изучал.
              +2
              А вообще доки к Симфони и блог Фабиена написаны довольно простым английским. Настолько, что может создаться ложно впечатление, что английский знаешь :) Когда читаю, то уже не перевожу на русский каждое слово. Сейчас вот не удержался и все частей, которые уже вышли прочитал.
                +1
                Согласен, читать просто и легко, но всё же, думаю, многим на русском читать будет проще.
                  +1
                  Солидарен, но было немного затруднительно перевести игру слов и тех. моменты. Я не переводчик, и язык учил по субтитрам в фильмах или с оригиналом на заднем плане. Как для меня, было довольно сложно в понятном виде перевести такие фразы как:
                  To refactor an old/existing application that needs a good dose of recent web development best practices;

                  Many modern web frameworks call themselves MVC frameworks. We won't talk about MVC here as the Symfony2 Components are able to create any type of frameworks, not just the ones that follow the MVC architecture. Anyway, if you have a look at the MVC semantics, this series is about how to create the Controller part of a framework.
                  Тут очень хотел донести изначальный смысл (получилось ли судить вам), так как Fabien на самом деле тот еще троль) (Обычно каждый четверг на фриноде)
                    –1
                    Я бы перевёл так:
                    Чтобы сделать рефакторинг старых/существующих приложения, нуждающихся в доброй дозе свежих лучших практик веб-разработки.
                    Многие современные веб-фреймворки называют себя MVC-фреймворками. Тут мы не будем говорить о MVC, потому что Symfony2 Components способны создать любые виды фреймворков, а не только те, которые следуют архитектуре MVC. Тем не менее, если вам нужна семантика MVC, то это цикл о том, как создать часть фреймворка "Контроллер".

                    Не стоит, по-моему, далеко отходить от особенностей лексики оригинала, тем более для «блогозаписей». (Представляю, как сложно при переводе на английский передать нюансы блогозаписей Mithgol'а, благодаря которым мы узнаем их автора зачастую ещё по заголовку. :-D Англичанин их не заметит, скорее всего, а русский, вероятно, не сможет найти такие редкоупотребляемые или архаичные английские формы.)

                      +1
                      *приложений
                        +1
                        *создать = образовать

                        Надо, всё-таки, пользоваться предпросмотром :)
                          –1
                          Камрад Mithgol, перелогинтесь. :) Ну а по существу, просто не хотел что бы текст сухой получился. (По типу как с гуглотранслейта или промта)
                0
                Не на основе Symfony 2, а на основе Symfony2 Components
                  +2
                  Symfony 2 — это не веб фреймворк, а набор библиотек, на основе которого и был создан Symfony2 Framework. А на основе Symfony 2 даже собираются делать Drupal 8. Насколько я помню, это написано в официальном блоге Фабиена.
                    +1
                    Как написали выше Symfony2 является набором бандлов(Bundles) т.е. независимых компонентов.
                      +3
                      Судя по каментам в этой ветке у каждого свое мнение что такое Symfony2 )
                    +1
                    Иногда писать свои фреймворки — и правда полезное занятие. Большинство существующих решений перегружены избыточным функционалом. Так, например, взять Zend Framework — отличный продукт, про процесс маршрутизации внутри фреймворка просто перегружен излишествами, которые зачастую-то и не используются. И хотя при реализации различных проектов с этим фактом можно мириться, но иногда возникают задачи написать свой каркас приложения, в духе «ничего лишнего, только основное».
                    Вставлю свои 5ть копеек — было дело, писал по работе php-фреймворк, с достаточно минималистичным функционалом (реализация конфигов, роутинг, диспетчеризация, MVC, шаблоны и управление js/css). Но в качестве реализации ORM и для работы с формами всё равно брал Zend_Db и Zend_Form соответственно. И если прикрутить к проекту Zend_Db — как нефиг делать, то с Zend_Form пришлось повозиться. В Zend Framework-е Zend_Form сильно связан с другими компонентами фреймворка (например Zend_View) и вместе с необходимыми классами форм приходится тянуть вереницу других зависимостей. Удалось решить это лишь через написание специального Адаптера.
                      0
                      Следующую часть переведу к субботе. + (Забегая на перед) Как бонус выложу результаты своего сравнения микро-фреймворков.
                        0
                        Спасибо, за то что взялись это переводить. Хоть я в оригинале и прочитал уже все 5 частей, но гораздо приятней на русском почитать это.
                        0
                        Компоненты Симфонии одна из тех вещей за что я люблю Симфонию.
                          0
                          Symfony не симфония, симфония — symphony
                            0
                            Это видимо парень с симфони камп. Он весь доклад гоаорил симфония. Под конец было желание чем-то кинуть
                          0
                          Не сдержал обещание на счет субботы, но за сегодня перевел 2 статьи. Надеюсь вам нравится… Фабиен обещает больше дюжины статей, и я хочу всех их перевести…

                          Only users with full accounts can post comments. Log in, please.