Pull to refresh

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

Reading time 4 min
Views 19K
Original author: Fabien Potencier
Оглавление


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 за помощь в переводе.
Tags:
Hubs:
+8
Comments 29
Comments Comments 29

Articles