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

Symfony 3

  • 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.
    Изменения в Symfony3! Каталоги /app/cache, /app/logs перемещены в /var/cache, /var/logs (что логично) phpunit.xml теперь в корневом каталоге (а не в app, как было раньше) Запуск консольных команд из /app/console -> /bin/console
  • 12.
    Новое в Symfony2.8/3.0 микрофреймворк (use MicroKernelTrait) - определяет registerBundles, configureRoutes, configureContainer) улучшение в поддержке консоли (ProgressIndicator, стили столбцов таблицы) поддержка LDAP в сервисе аутентификации autowiring служб (не нужно явно указывать зависимость!) новый интерфейс для аутентификации-авторизации
  • 13.
    Новое в Symfony2.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 = newData(); $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
  • 25.
  • 26.
  • 27.
    Спасибо за внимание! Приходитек нам и приглашайте друзей. Сообщество “ИТ. Герценовский университет”: http://goo.gl/FEieqK Дмитрий Золотов dzolotov@herzen.spb.ru