Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Inversion of control in Symfony 2

Peter
November 09, 2012

Inversion of control in Symfony 2

Comparation of IoC principle realisations (with Service Locator and Dependency Injection) and usage in Symfony 2

Peter

November 09, 2012
Tweet

More Decks by Peter

Other Decks in Programming

Transcript

  1. Крошка сын к отцу пришел, И спросила кроха: «Что такое

    хорошо и что такое Symfony 2» пятница, 9 ноября 12 г.
  2. Because I really don't care whether Symfony2 is MVC or

    not. Probably because the MVC word is so overloaded and because nobody implements exactly the same MVC pattern anyway. The separation of concerns is all I care about. О концепции Symfony в целом Скорость и легкость Гибкость Расширяемость W ut? пятница, 9 ноября 12 г.
  3. • Много • Независимо • Круто Separation of concerns •

    Очевидность использования • Расширяемость • Устойчивость • Повторное использование Бонусы пятница, 9 ноября 12 г.
  4. class TextEditor { private $checker; public textEditor() { $this->checker =

    new SpellChecker(); } } class TextEditor { private $checker; public TextEditor(ISpellChecker $checker) { $this->checker = $checker; } } Inversion of Control пятница, 9 ноября 12 г.
  5. Inversion of Control • Система строится на основе абстракций •

    Несвязанность модулей верхнего и нижнего уровней • Абстрации не зависят от подробностей Реализации • Service Locator • Dependency Injection пятница, 9 ноября 12 г.
  6. Service Locator • По простому class serviceLocator { public static

    function getDatabase() { return new database(); } } • Dynamic SL get-set пятница, 9 ноября 12 г.
  7. Property injection (public property) services: my_mailer: # ... newsletter_manager: class:

    NewsletterManager properties: mailer: @my_maile Dependency Injection пятница, 9 ноября 12 г.
  8. Constructor injection services: my_mailer: # ... newsletter_manager: class: NewsletterManager arguments:

    [@my_mailer] Dependency Injection пятница, 9 ноября 12 г.
  9. Dependency Injection Setter injections services: my_mailer: # ... newsletter_manager: class:

    NewsletterManager calls: - [ setMailer, [ @my_mailer ] ] пятница, 9 ноября 12 г.
  10. • DiC container строит граф зависимых объектов при буте •

    Будучи загруженным, сервис не может быть переорпеделен (в отличие от Service Locator’a) • Слабое связывание кода • Type Hinting • Локализация сервисов для дэбага и тестирования Плюсы пятница, 9 ноября 12 г.
  11. /** * Boots the kernel. * * @api */ public

    function boot() { ... // init container $this->initializeContainer(); foreach ($this->getBundles() as $bundle) { $bundle->setContainer($this->container); $bundle->boot(); } ... } /** * Initializes the service container. * * The cached version of the service container is used when fresh, otherwise the * container is built. */ protected function initializeContainer() { ... } Реализация в Symfony • HttpKernel • Bundles пятница, 9 ноября 12 г.