Dependency injection v Nette 2.1 prakticky

Post on 16-Jun-2015

1,241 views 2 download

transcript

Nette ❤ DI@ProchazkaFilip - @Damejidlo

Co si povíme?

- rychle prolítneme teorii DI- jak to funguje v Nette- jak napsat použitelné rozšíření

Teorie: typy injekce

- konstruktor- setter- property- magie

Konstruktor injectionclass 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

Setter injectionclass 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

Property injectionclass Cart extends Nette\Object { /** @var EntityManager */ public $entityManager;

http://wbab.suffolk.lib.ny.us/wp-content/uploads/2013/12/medals.jpg

Magic injectionclass Cart extends Nette\Object { /** @var EntityManager */ private $entityManager;

http://www.wyatt-lorenz.com/images/biohazard_warnings.jpg

Teorie: slovníček

- DI Container (composition root)- služby- implementace / abstrakce

Praxe: konfigurace

- služby- rozšíření

Registrace služby

services: - Damejidlo\Cart()

Konfigurace rozšíření

nette:latte:

macros: - Assets\CssMacro

Bacha na zanoření

parameters:

services:

nette:

Praxe: typy služeb

- modely- presentery- komponenty

Modely

- konstruktor (99.99%)- setter (když jsi v úzkých)- property (ehm?)

Presentery

- konstruktor (myslím že ne Time)- setter inject*() (přihořívá)- property @inject (vítěz!)

/** @var Damejidlo\Cart @inject */public $cart;

Presenteryservices:

productListPresenter:class: ShopModule\ProductsPresenter()setup:

- $tempPath(%tempPath%)# nebo- BlogModule\ArticlePresenter()

Komponenty

- konstruktor (ano prosím!)- setter (meh?)- property (bleh)

Komponenty v presenterechprotected function createComponentForm(){

return new OrderForm($entityManager???)}

Ruční továrničkyclass OrderFormFactory {

private $em;function __construct(EntityManager $em) { … }

/** @return OrderForm */public function create() {

return new OrderForm($this->em);}

Generované továrničky

interface IOrderFormFactory { /** @return OrderForm */ function create();}

Generované továrničky

services:orderFormFactory:

implement: IOrderFormFactory# nebo- {implement: IOrderFormFactory}

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

protected function createComponentOrderForm(){

$form = $this->orderFormFactory->create();$form->onSuccess[] = ...;return $form

}

Rozšířeníclass OrmExtension extends CompilerExtension {

# vytvori službypublic function loadConfiguration() { }# upravuje své a jiné službypublic function beforeCompile() { }# hackuje DI containerpublic function afterCompile() { }

Dobré rozšíření

- Composer - MUST HAVE- Jednoduchá registrace- Convention over Configuration- validujte

Dotazy?