Symfony2 practice

3,370 views

Published on

Talk about practical project (ticket system) on Symfony2 PHP framework

Published in: Education, Technology, Business
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,370
On SlideShare
0
From Embeds
0
Number of Embeds
447
Actions
Shares
0
Downloads
26
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Symfony2 practice

  1. 1. Alex Kornienko [email_address] Symfony 2 на практике Разработка реального проекта
  2. 2. Symfony 2 – какой он есть сейчас? <ul><li>Ежедневные обновления в twitter и github.com . github . com как сердце symfony 2 community </li></ul><ul><li>Существенные изменения (стадия PR3 ) </li></ul><ul><li>Основные компоненты переписаны на php 5.3. Идет активная работа над самим фреймворком </li></ul><ul><li>Разработчики получают информацию с обновляемой документации по sandbox , проектов на github , исчерпывающей документации по компонентам и что очень важно, бандлы входящие в состав фреймворка – отличные примеры для написания своих. </li></ul>
  3. 3. Структура директорий проекта
  4. 4. Структура компонентов фреймворка
  5. 5. Бандлы приложения - независимы
  6. 6. Какая будет структура приложения? 1) Будут два бандла: TickerBundle – ядро тикет-системы и GuardBundle – контроль доступа (авторизация) 2) Независимые бандлы будут взаимодействовать через механизм сервисов и внедрение зависимостей ( Dependency Injection ) . Доступ к внешним классам получаем, например, через контейнер: $user=$this->container->getService('model.user')->getById( …) 3) В остальном – обычный MVC. Только для каждого бандла все свое: роутинг, конфиги, модели, контроллеры, виды
  7. 7. Symfony 2: 3 кита
  8. 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. 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. 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. 11. Создание и подключение моделей 1) Создадим внешний класс с методами по управлению юзерами, тикетами, .. например: <service id=&quot;model.user&quot; class=&quot;ApplicationTickerBundleModelUserModel&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. 12. Класс модели namespace ApplicationTickerBundleModel; use DoctrineORMEntityManager; use ApplicationTickerBundleEntitiesUser; 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. 13. Что дальше? <ul><li>Разобраться с другими бандлами, использовать кеширование </li></ul><ul><li>Для читабельности кода использовать TwigBundle </li></ul><ul><li>Использовать встроенный механизм по работе с формами, который недавно появился </li></ul><ul><li>Посмотреть в сторону MongoDB и Propel </li></ul>

×