in Профессиональное

Symfony 2 для разработчиков на symfony 1.x

Symfony 2.0 по сравнению с первой версией фреймворка шагнул далеко вперед. К счастью, MVC архитектура, лежащая в основе его ядра, позволяет использовать те же навыки, что вы использовали, разрабатывая приложения для symfony1 и для Symfony2. App.yml вы конечно тут не увидите, но маршрутизация, контроллеры и шаблоны сохранились.

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

Итак, расслабьтесь, и внимайте.

Структура директорий

Когда вы посмотрите на структуру директорий любого Symfony2 проекта (например Symfony2 Sandbox), вы конечно же заметите что структура сильно отличается от того что вы видели раньше. Однако, когда мы копнем поглубже, окажется что изменения не так уж и серьёзны.

Директория app/

В symfony1 ваш проект мог иметь одно или больше приложений, каждое из которых располагалось в директории apps/ (например apps/frontend). По умолчанию в Symfony2 у вас есть лишь одно приложение, которое расположено в директории app/. Как и в symfony1 директория app/ содержит конфигурационные файлы приложения. Также тут содержится кеш приложения, лог и директории для шаблонов, а так же класс Kernel (AppKernel), который является базовым объектом, представляющим приложение.

В отличие от symfony1 в директории app/ в основном располагается не PHP-код. Эта директория не содержит модулей или библиотек, как это делает symfony1. Вместо этого, тут расположены конфигурационные файлы и прочие ресурсы (шаблоны, файлы переводов и т.п.).

Директория src/

Будем кратки: основной ваш код располагается здесь. В Symfony2 весь код приложения располагается в пакете (bundle, который приблизительно можно сравнить с плагином в symfony1) и, по умолчанию, каждый пакет располагается в директории src/. Таким образом, директорию src можно сравнить с директорией plugins в symfony1, но все-таки она дает разработчику больше свободы и гибкости. Также, в случае, если ваши пакеты располагаются в директории src/, сторонние пакеты можно расположить в директории vendor/.

Для того чтобы получить более полную картину о директории src/, давайте вспомним о том как у нас все было организовано в приложении symfony1. Часть вашего кода скорее всего располагалась в одном или более приложений. Как правило код включал в себя модули, но это также могли быть прочие классы, которые вы сочли нужным разместить там. Вы также могли создать файл schema.yml в директории config вашего проекта и создать множество файлов модели. Наконец, для того чтобы не изобретать велосипеды, вы пользовались несколькими сторонними плагинами, которые располагались в директории plugins/. Другими словами, код, заставляющий взлетать ваше приложение, располагался в множестве различных мест.

В Symfony2 жизнь намного проще, потому что весь код приложения в Symfony2 должен располагаться внутри пакета (bundle). Следуя аналогии, в symfony1 весь наш код должен был бы быть размещен в одном или нескольких плагинах (что само по себе является неплохой практикой). Полагая что все наши модули, PHP классы, схема, конфигурация маршрутизатора и т.д. переедут в плагин, тогда директория plugins/ из symfony1 будет очень похожа на директорию src/ в Symfony2

Кратко резюмируя, в директории src/ будут расположены ваш код, ассеты, шаблоны и много чего еще, что дает жизнь вашему проекту.

Директория vendor/

Директория vendor/ в основном похожа на директорию lib/vendor из symfony1, которая была общепринятым местом хранения всех сторонних библиотек. По умолчанию, вы найдете в этой директории библиотечные файлы Symfony2, а также несколько вспомогательных библиотек, таких как Doctrine2, Twig и Swiftmailer.

Директория web/

В директории web/ поменялось не так уж и много. Наиболее заметное изменение – это отсутствие директорий css/, js/ и images/. Не беспокойтесь, это было сделано преднамеренно. Как и в случае с вашим PHP кодом, все ассеты также должны располагаться внутри пакета (bundle). При помощи консольной команды, директория Resources/public каждого пакета копируется или линкуется символической ссылкой в директорию web/bundles/. Это позволяет вам упорядоченно хранить ваши ассеты внутри пакета, а также делать их доступными пользователям. Для того чтобы быть уверенными, что все пакеты доступны, выполните следующую команду:

./app/console_dev assets:install web --symlink
Отметим также, что эта команда эквивалентна команде symfony1 - plugin:publish-assets.

Автозагрузка

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

В symfony1 автозагрузчик выполнял поиск PHP классов по всему проекту и кешировал эту информацию в гигантском массиве. Этот массив устанавливал строгое соответствие какой файл содержит тот или иной класс. В продуктовом окружении эта операция требовала очистки кеша при добавлении нового класса или перемещении уже существующего.

В Symfony2 за этот процесс отвечает класс UniversalClassLoader. Идея его проста: имя класса (включая пространство имен) должно соответствовать пути к файлу, который содержит класс. Давайте рассмотрим HelloController из песочницы Symfony2 в качестве примера:

namespace SensioHelloBundleController;
use SymfonyBundleFrameworkBundleControllerController;
class HelloController extends Controller
{
    // ...

Сам файл располагается по пути src/Sensio/HelloBundle/Controller/HelloController.php. Как вы видите, расположение файла соответствует пространству имен класса. А именно, пространство имен SensioHelloBundleController, сообщает что директория, где будет расположен файл – srcSensioHelloBundleController.

Если файл не будет найден по ожидаемому пути, вы получите ошибку: Class "SensioHelloBundleControllerHelloController" does not exist.. В Symfony2 ошибка “class does not exist” означает, что пространство имен класса и его физическое расположение на диске не совпадают. Таким образом, Symfony2 ищет класс в одном единственном месте, которое ему положено. Кроме того, для того чтобы класс был автозагружен, вам никогда не придется очищать кеш в Symfony2.

Тем не менее, для того чтобы автозагрузчик работал правильно, ему нужно знать, что пространство имен Sensio расположено в директории src и, например, что пространство имен Doctrine располагается в директории vendor/doctrine/lib/. Данные правила полностью контролируются разработчиком (вами) посредством файла app/autoload.php.

Консоль

В symfony1 консоль располагалась в корневой директории вашего проекта и называлась symfony.

В Symfony2 консоль располагается в суб-директории приложения и называется console.

Консоль обслуживает только одно окружение (например dev, prod). Это поведение отличается от symfony1, где некоторые задачи (task) позволяли вам указать окружение через опцию env=. Распространённой практикой является создание отдельного командного файла для каждого окружения. Как правило это означает наличие файла console для prod и console_dev для dev окружений.

Приложения

В проекте на symfony1 обычной практикой было создавать несколько приложений: например frontend и backend.

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

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

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

Совет: почитайте определения проекта, приложения, и пакета в глоссарии.

Пакеты и плагины

В проекте symfony1 плагин должен содержать конфигурацию, модули, PHP библиотеки, ассеты и все прочее, относящееся к вашему проекту. В Symfony2 место плагина заняли пакеты (bundles). Пакет даже более функционален нежели плагин, потому что ядро Symfony2 состоит из последовательности пакетов. В Symfony2 пакет это гражданин высшего сорта, настолько гибкий, что даже ядро это пакет.

В symfony1 плагин должен быть активирован в классе ProjectConfiguration:

// config/ProjectConfiguration.class.php
public function setup()
{
    $this->enableAllPluginsExcept(array(/* some plugins here */));
}

В Symfony2 пакеты активируются внутри ядра приложения:

// app/AppKernel.php
public function registerBundles()
{
    $bundles = array(
        new SymfonyBundleFrameworkBundleFrameworkBundle(),
        new SymfonyBundleTwigBundleTwigBundle(),
        // ...
        new SensioHelloBundleHelloBundle(),
    );

    return $bundles;
}

Также необходимо удостовериться что пространство имен Sensio присутствует в автозагрузчике:

// app/autoload.php
$loader = new UniversalClassLoader();
$loader->registerNamespaces(array(
    'Symfony'                        => __DIR__.'/../vendor/symfony/src',
    'Sensio'                         => __DIR__.'/../src',
    // ...
));

В symfony1 конфигурационные файлы routing.yml и app.yml загружались автоматически для любого плагина. В Symfony2 маршруты и конфигурация приложения из пакета должны быть подключены вручную. Например, чтобы подключить маршрутизацию из пакеты, вы должны выполнить следующее:

# app/config/routing.yml
hello:
    resource: @HelloBundle/Resources/config/routing.yml

Таким образом, чтобы получить конфигурацию пакета, вам нужно ее импортировать в конфигурации вашего приложения.

Оригинал тут: http://docs.symfony-reloaded.org/guides/symfony1.html

Перевод авторский 😉

Leave a Reply for takitak Cancel Reply

Write a Comment

Comment

ERROR: si-captcha.php plugin: GD image support not detected in PHP!

Contact your web host and ask them to enable GD image support for PHP.

ERROR: si-captcha.php plugin: imagepng function not detected in PHP!

Contact your web host and ask them to enable imagepng for PHP.

20 Comments

  1. Самый волнующий меня вопрос. Генераторы админки в симфони 2 будут?

    • Честно говоря еще не интересовался этим вопросом. Вернее интересовался, но не копал глубоко ) Как что-то узнаю -обязательно напишу.

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

  2. Прошу прощение если пишу что-то не так.
    Так и не понимаю в чем преимущество symfony1 перед другими фреймворками.
    Да, есть jobeet – но не похоже что там сильно облегчена работа программиста, на вид код не на много проще и его не меньше чем если использовать какой-нибудь другой фреймворк или на крайний случай писать на чистом PHP.

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

    • Пардон, tutor если и буду писать то по symfony2. С другой стороны почему вы не попросили тьютор по Django или Rails3? Может они вашу работу смогут облегчить? Или .Net MVC )))

      • В данном контексте я интересуюсь имеено PHP.
        Да и вроде в блоге про symfony, а не про Django или RoR.
        А то что symfony2 это даже хорошо 🙂

        • Хорошо, а какими вы видите конкурентов? ) Я в ходе своей практики сталкивался с CakePHP, CodeIgniter и ZendFramework. Symfony 1.x понравился своей архитектурой, которая все-таки удовольствия от кодирования доставляет больше чем проблем (имхо!). К Symfony2 пока сам не знаю как относиться. С точки зрения техничности кода однозначно Level Up. Но я пока не решился бы использовать его в реальных проектах. Может когда переведу больше статей – проникнусь идеей )

          • Нравится? Ну и не надо их пиписками мерять ) Программируйте, получайте fun!

  3. А как с консолью под виндой? Работать с Symfony tools из IDE или делать php скрипт и из него с консолью работать (не удобно). Кто как?

        • ну да. Не знаю как у кого, но у меня LAMP в виртуалке шевелится куда быстрее, чем любая из сборок, которые я ставил на Win. Даже с учетом того, что IDE (Aptana или NetBeans) я запускаю прямо в виртуалке.

  4. А есть ли где то полный список консольных команд для симфони и доктрины?

      • Спасибо, вот о такой страничке и была речь, удобно когда можно видеть все команды отдельно от консоли.

          • Я с консолью не так дружу, да и в винде она намного хуже чем в линуксе.

        • Я php в PATH в писал и горя не знаю ) Конечно bash нету, а PowerShell мне лень учить. Но тем не менее…