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

Dependency injection v Nette 2.1 prakticky

Dependency injection v Nette 2.1 prakticky

Filip Procházka

January 27, 2014
Tweet

More Decks by Filip Procházka

Other Decks in Technology

Transcript

  1. Nette ❤ DI @ProchazkaFilip - @Damejidlo

  2. Co si povíme? - rychle prolítneme teorii DI - jak

    to funguje v Nette - jak napsat použitelné rozšíření
  3. Teorie: typy injekce - konstruktor - setter - property -

    magie
  4. Konstruktor injection class Cart extends Nette\Object { private $entityManager; public

    function __construct(EntityManager $em) { $this->entityManager = $em; } http://wbab.suffolk.lib.ny.us/wp-content/uploads/2013/12/medals.jpg
  5. Setter injection class Cart extends Nette\Object { private $entityManager; public

    function setEntityManager(EntityManager $em) { $this->entityManager = $em; } http://wbab.suffolk.lib.ny.us/wp-content/uploads/2013/12/medals.jpg
  6. Property injection class Cart extends Nette\Object { /** @var EntityManager

    */ public $entityManager; http://wbab.suffolk.lib.ny.us/wp-content/uploads/2013/12/medals.jpg
  7. Magic injection class Cart extends Nette\Object { /** @var EntityManager

    */ private $entityManager; http://www.wyatt-lorenz.com/images/biohazard_warnings.jpg
  8. Teorie: slovníček - DI Container (composition root) - služby -

    implementace / abstrakce
  9. Praxe: konfigurace - služby - rozšíření

  10. Registrace služby services: - Damejidlo\Cart()

  11. Konfigurace rozšíření nette: latte: macros: - Assets\CssMacro

  12. Bacha na zanoření parameters: services: nette:

  13. Praxe: typy služeb - modely - presentery - komponenty

  14. Modely - konstruktor (99.99%) - setter (když jsi v úzkých)

    - property (ehm?)
  15. Presentery - konstruktor (myslím že ne Time) - setter inject*()

    (přihořívá) - property @inject (vítěz!) /** @var Damejidlo\Cart @inject */ public $cart;
  16. Presentery services: productListPresenter: class: ShopModule\ProductsPresenter() setup: - $tempPath(%tempPath%) # nebo

    - BlogModule\ArticlePresenter()
  17. Komponenty - konstruktor (ano prosím!) - setter (meh?) - property

    (bleh)
  18. Komponenty v presenterech protected function createComponentForm() { return new OrderForm($entityManager???)

    }
  19. Ruční továrničky class OrderFormFactory { private $em; function __construct(EntityManager $em)

    { … } /** @return OrderForm */ public function create() { return new OrderForm($this->em); }
  20. Generované továrničky interface IOrderFormFactory { /** @return OrderForm */ function

    create(); }
  21. Generované továrničky services: orderFormFactory: implement: IOrderFormFactory # nebo - {implement:

    IOrderFormFactory}
  22. Generované továrničky /** @var IOrderFormFactory @inject */ public $orderFormFactory; protected

    function createComponentOrderForm() { $form = $this->orderFormFactory->create(); $form->onSuccess[] = ...; return $form }
  23. Rozšíření class OrmExtension extends CompilerExtension { # vytvori služby public

    function loadConfiguration() { } # upravuje své a jiné služby public function beforeCompile() { } # hackuje DI container public function afterCompile() { }
  24. Dobré rozšíření - Composer - MUST HAVE - Jednoduchá registrace

    - Convention over Configuration - validujte
  25. Dotazy?