суббота, 6 марта 2010 г.

Что новенького в Symfony 2?

Просмотрим мельком ту, пока еще небогатую, документацию к новой версии Symfony, и отметим, что же нового готовит нам Sensio Labs.
Наверное, уже всем известно, что Symfony 2 будет требовать PHP 5.3.

Поменялось дерево каталогов. Наверное, еще рано делать глобальные выводы, но некоторые улучшения налицо: папки с приложениями теперь вынесены в корень. Удалено ненужное звено /apps/.

frontend_dev.php стал называться index_dev.php. Мелочь, а приятно. (Я знаю, что можно поменять бла-бла-бла...).

Контроллер

Контроллер стал красивее. О Боже! Они наконец-то назвали экшены человеческими именами! executeList звучало странно. listAction звучит много лучше. В качестве параметров экшен теперь принимает не sfWebRequest, а параметры, описанные в роуте, который направил на этот экшен. Удобно, черт побери! Изменился формат описания роутов. Стало возможно подключать в основном файле описания routing.yml роут-файлы из других пакетов. Что ж, удобно! В роуте можно указать, в каком формате должен выдать результат экшен: HTML, XML, JSON, ... Объект Response по-прежнему жив, и отвечает за выдачу информации от экшена.

Обработка ошибок построена на исключениях. Теперь, например, если запрашиваемый в экшене объект не найден, то не форвардим на экшен error404, а бросаем исключение NotFoundHttpException.

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

Bundles

Bundle, bundle, bundle, bundle... Что же это? Это Symfony, друг мой. На языке Symfony bundle - это пачка взаимосвязанных файлов - PHP, HTML, CSS, картинки,... Все в Symfony 2.0 состоит из bundle. Bundle реализует какую-то одну завершенную штучку - форум, блог, новости, и т.п. Этим bundle можно легко поделиться с кем-нибудь. Вобщем, что-то вроде плагина. Но не плагин, т.к. из bundle состоит все в симфонии - ядро, сторонние разработки, собственный функционал проекта. Подключение bundles очень прозрачно - теперь легко можно решить, какой функционал должен нести фреймворк, а какой - нет. Это гениально. Нужна БД? Подключай bundle. Кэширование? Тоже bundle. Логгер? Ну конечно же, bundle. А все ненужное отрежем и выбросим. Вы уже определились с блюдами, сэр?

Привычный User (тот самый, который $sf_user) - это тоже bundle... Ну как тут не вспомнить рекламу Symfony 2 - "Подходит под любой проект - от визитки до портала".

View

Шаблоны. Наконец-то нормальные имена шаблонам! listSuccess несколько обескураживало. А вот нововведение посерьезнее: шаблоны могут декорироваться другими шаблонами. ($this->extend(родительский_шаблон)). Причем цепочка наследования может состоять из нескольких звеньев. Все шаблоны имеют "путь", состоящих из трех частей, и разделяющихся двоеточием - Bundle:контроллер:имя_шаблона.

Остались слоты. Фактически, все шаблоны - это теперь слоты, которые вставляются в layout. Партиалов не осталось как таковых (ну или все шаблоны стали партиалами - как вам угодно), вместо этого стало возможным подключать любые шаблоны из любых шаблонов - по тому же самому принципу, как это делалось с партиалами. А теперь внимание, фокус! Стало возможным вставлять в шаблон результат исполнения любого другого экшена! Конец эпохи sfComponent.

Хелперы по-прежнему живы. Улучшена работа с подключением картинок, CSS, JS - его сделали более абстрактным для улучшения portability.

Архитектура

Проект состоит из нескольких частей (раскиданы по папкам):
- my_application_name/ - хранит настройки приложения проекта
- src/ - тут лежит весь PHP-код, который используется в проекте
- web/ - доступная из интернета папка, где лежат картинки, СSS, JS, другие доступные файлы

Наибольший интерес представляют первые две части, потому что третья уже знакома нам по 1.х. Приложение - это экземпляр класса myApplicationNameKernel, который запускается в нужном окружении (environment). Этот класс подтягивает все необходимые bundles, конфигурирует проект и регистрирует роуты. Все файлы-классы, разумеется, подтягиваются автоматически, никаких require и include. И все это под соусом namespaces из PHP 5.3. Работа в консоли теперь ведется так:
$ php my_application_name/console router:debug --help



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

Комментариев нет:

Отправить комментарий