1. Symfony 3
Компонентная разработка в модели MVC на PHP7
Дмитрий Золотов,
ведущий инженер,
dzolotov@herzen.spb.ru
Управление информатизации РГПУ им. А.И.Герцена
Санкт-Петербург, 2015
2. Нужен ли вам фреймворк?
В вашем приложении?
есть формы с необходимостью проверки корректности заполнения
есть разделение содержимого (или доступности) страниц по ролям
пользователей
существуют шаблонные страницы с заполнением из БД
сложная бизнес-логика и работа с данными
3. С чего всё началось?
Как и многие другие проекты - с лени.
Обобщение опыта решения типовых задач веб-разработки.
Проекту в этом году - 10 лет
4. С чего всё началось?
Существует много типовых задач, которые реализуются в большинстве
приложений (шаблонизация, проверка доступа, работа с данными и др.,
создание и проверка форм, кэширование)
Сложные PHP-приложения требуют подключения дополнительных
библиотек
Нужен был способ упаковки компонентов и их связывания (Dependency
Injection)
5. Symfony - это синтез проектов
Composer - управление зависимостями и автозагрузкой
Doctrine - объектно-реляционное отображение для БД
Twig - гибкая библиотека быстрого построения шаблонов
Monolog - библиотека для записи журналов
Swift Mailer - обработка электронной почты
...
6. Что такое Symfony?
Если коротко:
контейнер сервисов (подключает, регистрирует и связывание сервисы
из bundle - внешних или из приложения)
маршрутизатор запросов (вызывает контроллер для указанной маски
адреса)
аутентификатор (проверка доступа пользователя к ресурсу)
множество полезных библиотек (например, для разбора YAML)
7. Проекты, которые используют Symfony
Другие фреймворки: Drupal, Laravel, Silex
Платформы: phpbb, EZ CMS, Joomla, Composer, Magento
Интеграция: Wordpress
8. Symfony - недостатки?
считается массивным (но версия 3.0 может работать как
микрофреймворк)
нет встроенного MVC Pull (возможности отложенного извлечения
данных видом из контроллера)
использование устаревшей версии PHP (с версии 3.0 - уже не так,
требование - PHP 5.5)
сложность разработки - сейчас уже нет, аннотации упрощают создание
конфигурации
9. Какие ещё есть фреймворки?
скорость и лёгкость - Kohana (CodeIgniter)
лёгкое связывание с данными - CakePHP
библиотека визуальных компонентов - Yii
MVC Pull - Prado
минимализм - Fat-Free Framework
10. Что определяет Symfony?
Структуру каталогов:
/app - ядро приложения, yaml-конфигурации (для framework в целом и
компонентов в частности), глобальные ресурсы
/bin - инструменты для проверки проекта, загрузки зависимостей, построение
каркасов Doctrine, …
/src, /tests - в соответствии с PSR-4 исходные тексты и тесты для Bundle
/var - все изменяемые данные (кэши, логи, сессии, …)
11. Изменения в Symfony 3!
Каталоги /app/cache, /app/logs перемещены в /var/cache, /var/logs (что
логично)
phpunit.xml теперь в корневом каталоге (а не в app, как было раньше)
Запуск консольных команд из /app/console -> /bin/console
12. Новое в Symfony 2.8/3.0
микрофреймворк (use MicroKernelTrait) - определяет registerBundles,
configureRoutes, configureContainer)
улучшение в поддержке консоли (ProgressIndicator, стили столбцов
таблицы)
поддержка LDAP в сервисе аутентификации
autowiring служб (не нужно явно указывать зависимость!)
новый интерфейс для аутентификации-авторизации
13. Новое в Symfony 2.8/3.0
PropertyInfo - анализ метаданных классов, сущностей, …
Новый тип RangeType для форм
Возможность пометки deprecated-сервисов
Улучшенный дизайн для web profiler
Полная совместимость с PHP7
14. Что такое Bundle?
Самостоятельное приложение, состоящее из:
контроллеров (Controller)
тестов (Tests)
ресурсов (Resources): виды (шаблоны), переводы (translations),
конфигурации (config), документация (doc), статические ресурсы
(public)
15. Bundle - продолжение
Также могут быть:
зарегистрированные консольные команд (Command)
модели данных (Model)
обработчики событий (EventListener)
...
16. Компоненты Symfony
Filesystem - доступ к файлам и файловой системе
Polyfill - поддержка новых функций на устаревших версиях PHP
Asset - создание URL для статических ресурсов
DomCrawler - просмотр дерева HTML DOM
CssSelector - преобразование CSS Selector -> XPath
17. Конфигурация приложения
/app/config/config.yml:
parameters / locale - язык
framework / secret - “соль” для токенов и cookies
framework / router - настройки маршрутизации
framework / templating - настройки шаблонизации (движок, версии
assets)
18. Дополнительные настройки
monolog - правила для протоколирования (уровень, расположение),
компонент: logger
twig - настройки шаблонизации (режим отладки), компонент: templating
app - правила маршрутизации, можно использовать аннотации в
исходных текстах (type=annotation, resource =
“@AppBundle/Controller”), компонент: router
security - настройки безопасности
19. Маршрутизация
Аннотация в контроллере:
@Route(“path”[, name=”...”)
Путь может включать переменные {...} - параметры метода
Например,
@Route(”/hello/{name}”)
public function hello($name) { return $this-
>render(”default/index.html.twig”)}
Можно указывать requirements - регулярные выражения
20. Безопасность
providers - поставщики информации об учетных записях (можно
использовать in_memory, логины-пароли и роли в файле конфигурации)
encoders - правила кодирования пароля (например,
SymfonyComponentSecurityCoreUserUser: plaintext)
firewalls - правила безопасности (pattern и security), страницы выхода
(logout)
access_control - путь и требуемые роли
role_hierarchy - отношения наследования ролей
21. Логика
Определяется набором именованных связанных служб (services.yaml)
Создание экземпляра - средствами контейнера $this->get(“name”) или
неявно при autowiring.
22. Формы
$obj = new Data();
$form = $this->createFormBuilder($obj)->add(”fieldname”,...)->...-
>getForm();
$form->createView() - создаёт html-представление
$form->handleRequest($request);
if ($form->isValid()) { … $this->redirectToRoute(‘name’); }
23. Работа с данными
Model/Entity (например, в Doctrine), namespace: AppBundleEntity
Автоматическое создание bean (по описанию класса с @ORMEntity):
bin/console doctrine:generate:entities AppBundle
Поиск:
$repository = $this->getDoctrine()-
>getRepository(”AppBundle:Users”);
$user = $repository->find($id);
$users = $repository->findAll();
$users = $repository->findByOU(”Управление информатизации”)
24. Варианты компоновки приложения
REST-сервис: Model + Controller (маршрутизация REST-правил и HTTP-методов)
Web-приложение: страницы в шаблонах, Controller + Forms (+security) для
описания действий на интерфейсе, Model для извлечения и обновления данных.
Желательно также создавать сервисы и переносить в них бизнес-логику.
Консольное приложение: class … extends Command, регистрация
configure, execute (getArgument, getOption), ProgressIndicator
27. Спасибо за внимание!
Приходите к нам и приглашайте друзей.
Сообщество “ИТ. Герценовский университет”: http://goo.gl/FEieqK
Дмитрий Золотов
dzolotov@herzen.spb.ru