6. Какая будет структура приложения? 1) Будут два бандла: TickerBundle – ядро тикет-системы и GuardBundle – контроль доступа (авторизация) 2) Независимые бандлы будут взаимодействовать через механизм сервисов и внедрение зависимостей ( Dependency Injection ) . Доступ к внешним классам получаем, например, через контейнер: $user=$this->container->getService('model.user')->getById( …) 3) В остальном – обычный MVC. Только для каждого бандла все свое: роутинг, конфиги, модели, контроллеры, виды
8. Связывание бандлов при помощи DI контейнера. Проектирование служб. 1) Информация обо всех зависимостях, подключенных бандлах и сервисах хранится в контейнере. 2) Контейнер внедрения зависимостей создается на этапе создания ядра приложения (следующий слайд). 3) Пример создания сервиса: <service id="controller_manager" class="%controller_manager.class%"> <argument type="service" id="service_container" /> <argument type="service" id="logger" on-invalid="ignore" /> </service> 4) Для каждого бандла предусмотрен механизм расширения контейнера внедрения зависимостей. То есть добавления и «перетирания» существующих сервисов (механизм extensions ).
9. Запуск ядра ( kernel ) приложения public function boot() { if (true === $this->booted) {throw new ogicException('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="model.user" class="ApplicationickerBundleodelserModel"> <argument type="service" id="doctrine.orm.entity_manager" /> </service> 2) Создадим соответствующий класс (следущий слайд). 3) В контроллере вызовем метод из соответствующей модели: if ($this->getRequest()->getMethod() == 'POST') { $id = $this->getRequest()->request->get('id') ; $user = $this->container->getService('model.user')->deleteById( $id ); }
12. Класс модели namespace ApplicationickerBundleodel; use DoctrineRMntityManager; use ApplicationickerBundlentitiesser; class UserModel { protected $em; //EntityManager instance public function __construct( EntityManager $em ){ $this->em = $em; } public function deleteById($id) { $query = $this->em-> createQuery("SELECT u FROM TickerBundle:User u WHERE u.id = $id"); $user = $query->getResult(); $this->em->remove($user[0]); $this->em->flush(); } }