Post on 16-Jun-2015
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?