Alex Kornienko [email_address] Symfony   2  на практике Разработка реального проекта
Symfony 2 –  какой он есть сейчас? Ежедневные обновления в  twitter   и  github.com . github . com  как сердце  symfony 2 community Существенные изменения (стадия  PR3 ) Основные компоненты переписаны на  php 5.3.  Идет активная работа над самим фреймворком Разработчики получают информацию с обновляемой документации по  sandbox ,  проектов на  github , исчерпывающей документации по компонентам   и что очень важно, бандлы входящие в состав фреймворка – отличные примеры для написания своих.
Структура директорий проекта
Структура компонентов фреймворка
Бандлы приложения - независимы
Какая будет структура приложения? 1)  Будут два бандла:  TickerBundle –  ядро тикет-системы и  GuardBundle –  контроль доступа (авторизация) 2)  Независимые бандлы будут взаимодействовать через механизм сервисов и внедрение зависимостей ( Dependency Injection ) .  Доступ к внешним классам получаем, например, через контейнер:   $user=$this->container->getService('model.user')->getById( …) 3)  В остальном – обычный  MVC.  Только для каждого бандла все свое: роутинг, конфиги, модели, контроллеры, виды
Symfony 2: 3  кита
Связывание бандлов при помощи  DI  контейнера. Проектирование служб. 1)  Информация обо всех зависимостях, подключенных бандлах и сервисах хранится в контейнере. 2)  Контейнер внедрения зависимостей создается на этапе создания ядра приложения (следующий слайд). 3)  Пример создания сервиса: <service id=&quot;controller_manager&quot; class=&quot;%controller_manager.class%&quot;> <argument type=&quot;service&quot; id=&quot;service_container&quot; /> <argument type=&quot;service&quot; id=&quot;logger&quot; on-invalid=&quot;ignore&quot; /> </service> 4)  Для каждого бандла предусмотрен механизм расширения контейнера внедрения зависимостей. То есть добавления и «перетирания» существующих сервисов (механизм  extensions ).
Запуск ядра ( kernel )   приложения public function boot() { if (true === $this->booted) {throw new \LogicException('The kernel is already booted.');} require_once __DIR__.'/bootstrap.php'; $this->bundles = $this->registerBundles(); $this->bundleDirs = $this->registerBundleDirs(); // initialize the container $this->container = $this->initializeContainer();   //  сразу же создаем  DI  контейнер $this->container->setService('kernel', $this); // boot bundles foreach ($this->bundles as $bundle) { $bundle->boot( $this->container );   //  основное внедрение зависимостей } $this->booted = true; return $this; }
Работа с  Doctrine 2 1) Подключение  Doctrine 2  просто в  config.yml .  2) Создание таблиц по их описанию и начальная инициализация производится автоматически с консоли. 3) Операции  CRUD  объявлены в службе  doctrine.orm.entity_manager 4) Очень простой доступ с контроллера (через контейнер): $em = $this->container->getService('doctrine.orm.entity_manager'); 5)  Но понятно, что логика по работе с БД должна быть во внешних классах (сервисах). На след слайде создадим их.
Создание и подключение моделей 1) Создадим внешний класс с методами по управлению юзерами, тикетами, .. например: <service id=&quot;model.user&quot; class=&quot;Application\TickerBundle\Model\UserModel&quot;> <argument type=&quot;service&quot; id=&quot;doctrine.orm.entity_manager&quot; /> </service> 2)  Создадим соответствующий класс (следущий слайд). 3) В контроллере вызовем метод из соответствующей модели: if ($this->getRequest()->getMethod() == 'POST') { $id =  $this->getRequest()->request->get('id') ; $user = $this->container->getService('model.user')->deleteById( $id ); }
Класс модели namespace Application\TickerBundle\Model; use Doctrine\ORM\EntityManager; use Application\TickerBundle\Entities\User; class UserModel { protected $em; //EntityManager instance public function __construct( EntityManager $em ){ $this->em = $em; } public function deleteById($id) {  $query = $this->em-> createQuery(&quot;SELECT u FROM TickerBundle:User u WHERE u.id = $id&quot;); $user = $query->getResult(); $this->em->remove($user[0]); $this->em->flush(); } }
Что дальше? Разобраться с другими бандлами, использовать кеширование Для читабельности кода использовать  TwigBundle Использовать встроенный механизм по работе с формами, который недавно появился Посмотреть в сторону  MongoDB  и  Propel

Symfony2 practice

  • 1.
    Alex Kornienko [email_address]Symfony 2 на практике Разработка реального проекта
  • 2.
    Symfony 2 – какой он есть сейчас? Ежедневные обновления в twitter и github.com . github . com как сердце symfony 2 community Существенные изменения (стадия PR3 ) Основные компоненты переписаны на php 5.3. Идет активная работа над самим фреймворком Разработчики получают информацию с обновляемой документации по sandbox , проектов на github , исчерпывающей документации по компонентам и что очень важно, бандлы входящие в состав фреймворка – отличные примеры для написания своих.
  • 3.
  • 4.
  • 5.
  • 6.
    Какая будет структураприложения? 1) Будут два бандла: TickerBundle – ядро тикет-системы и GuardBundle – контроль доступа (авторизация) 2) Независимые бандлы будут взаимодействовать через механизм сервисов и внедрение зависимостей ( Dependency Injection ) . Доступ к внешним классам получаем, например, через контейнер: $user=$this->container->getService('model.user')->getById( …) 3) В остальном – обычный MVC. Только для каждого бандла все свое: роутинг, конфиги, модели, контроллеры, виды
  • 7.
    Symfony 2: 3 кита
  • 8.
    Связывание бандлов припомощи DI контейнера. Проектирование служб. 1) Информация обо всех зависимостях, подключенных бандлах и сервисах хранится в контейнере. 2) Контейнер внедрения зависимостей создается на этапе создания ядра приложения (следующий слайд). 3) Пример создания сервиса: <service id=&quot;controller_manager&quot; class=&quot;%controller_manager.class%&quot;> <argument type=&quot;service&quot; id=&quot;service_container&quot; /> <argument type=&quot;service&quot; id=&quot;logger&quot; on-invalid=&quot;ignore&quot; /> </service> 4) Для каждого бандла предусмотрен механизм расширения контейнера внедрения зависимостей. То есть добавления и «перетирания» существующих сервисов (механизм extensions ).
  • 9.
    Запуск ядра (kernel ) приложения public function boot() { if (true === $this->booted) {throw new \LogicException('The kernel is already booted.');} require_once __DIR__.'/bootstrap.php'; $this->bundles = $this->registerBundles(); $this->bundleDirs = $this->registerBundleDirs(); // initialize the container $this->container = $this->initializeContainer(); // сразу же создаем DI контейнер $this->container->setService('kernel', $this); // boot bundles foreach ($this->bundles as $bundle) { $bundle->boot( $this->container ); // основное внедрение зависимостей } $this->booted = true; return $this; }
  • 10.
    Работа с Doctrine 2 1) Подключение Doctrine 2 просто в config.yml . 2) Создание таблиц по их описанию и начальная инициализация производится автоматически с консоли. 3) Операции CRUD объявлены в службе doctrine.orm.entity_manager 4) Очень простой доступ с контроллера (через контейнер): $em = $this->container->getService('doctrine.orm.entity_manager'); 5) Но понятно, что логика по работе с БД должна быть во внешних классах (сервисах). На след слайде создадим их.
  • 11.
    Создание и подключениемоделей 1) Создадим внешний класс с методами по управлению юзерами, тикетами, .. например: <service id=&quot;model.user&quot; class=&quot;Application\TickerBundle\Model\UserModel&quot;> <argument type=&quot;service&quot; id=&quot;doctrine.orm.entity_manager&quot; /> </service> 2) Создадим соответствующий класс (следущий слайд). 3) В контроллере вызовем метод из соответствующей модели: if ($this->getRequest()->getMethod() == 'POST') { $id = $this->getRequest()->request->get('id') ; $user = $this->container->getService('model.user')->deleteById( $id ); }
  • 12.
    Класс модели namespaceApplication\TickerBundle\Model; use Doctrine\ORM\EntityManager; use Application\TickerBundle\Entities\User; class UserModel { protected $em; //EntityManager instance public function __construct( EntityManager $em ){ $this->em = $em; } public function deleteById($id) { $query = $this->em-> createQuery(&quot;SELECT u FROM TickerBundle:User u WHERE u.id = $id&quot;); $user = $query->getResult(); $this->em->remove($user[0]); $this->em->flush(); } }
  • 13.
    Что дальше? Разобратьсяс другими бандлами, использовать кеширование Для читабельности кода использовать TwigBundle Использовать встроенный механизм по работе с формами, который недавно появился Посмотреть в сторону MongoDB и Propel