[di] nut van aware classen?
Ik heb nu een aantal aware classen zodat iedere class van het bestaan van een object kent.
Nu met DI zie ik niet echt meer het nut in van zo'n aware class...
Heb ik ze nog nodig of kan ik zo'n aware class koppelen met m'n service container?
Raoul
Code (php)
Zoiets vind ik dan nog steeds mooier dan gewoon raw ->get('event_manager') te callen.
Wat jij nu hebt hoort niet. Als het goed is injecteer je altijd alleen services die nodig zijn, nooit de hele container.
Wouter J op 02/02/2013 19:14:39:
Wat jij nu hebt hoort niet. Als het goed is injecteer je altijd alleen services die nodig zijn, nooit de hele container.
Dus de container mag niet meegegeven worden aan de controller?
Oh, je liet een controller zien. Zodra de controller geen service is mag je de container meegeven. Zoals ik net al in een topic van Ozzie zei houden sommige devs ervan om controllers ook als services te gebruiken, in dat geval mag je weer alleen de services injecteren die nodig zijn.
Gewijzigd op 02/02/2013 19:21:41 door - Raoul -
Stel we hebben een Router klasse. Deze heeft een UrlMatcher klasse nodig om een URL aan een Route te matchen. In dat geval moeten we een manier bedenken om de ene klasse in de andere te stoppen. In dat geval maken we dus van beide een service, bijv:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
services:
url_matcher:
class: Raoul\Framework\Routing\UrlMatcher
router:
class: Raoul\Framework\Routing\Router
arguments: [@url_matcher]
url_matcher:
class: Raoul\Framework\Routing\UrlMatcher
router:
class: Raoul\Framework\Routing\Router
arguments: [@url_matcher]
Nu hebben we een `url_matcher` service, deze maakt alleen een klasse aan. Vervolgens hebben we een `router` service die deze `url_matcher` service geinjecteert krijgt, dat betekend dat hij hem meegeeft aan de constructor. (met het @ teken refereren we naar een service in de config van symfony2)
Ah zo. Dus als ik het goed begrijp, tijdens het aanmaken van een Router instance word door DI, een url_matcher instance meegegeven als ik het goed begrijp?
Ja
Toevoeging op 02/02/2013 19:53:39:
// Waar stel ik dan bijvoorbeeld in dat ik een session storage wil gebruiken in DI, zonder de setter in de DI class te gebruiken?
Kun je je vraag iets verduidelijken?
Stel nu ik wil een een session storage gebruiken in een controller, en ik mag niet de reguliere ->get('session.storage') doen, hoe verkrijg ik dan die storage? Ik wil niet een controller als een service instellen.
Wouter J op 02/02/2013 20:11:16:
Als je controller geen service is mag je wel de reguliere $container->get('session.storage') (waar ik trouwens storage.session van zou maken). Maar als je controller een service is laat je hem ook gewoon injecteren:
Maar ik ga toch niet voor iedere controller een service maken?
Quote:
Maar ik ga toch niet voor iedere controller een service maken?
Klopt en dat is naar mijn mening ook helemaal niet een 'best practice' (controllers zijn geen globale objecten).
Daarom maak je vaak een basis controller (bijv. Raoul\Framework\Mvc\AbstractController.php) die een functie als getContainer bevat waar je de container injecteert (merk dus op dat hier geen service container aan te pas komt)
Gewijzigd op 02/02/2013 20:18:07 door Wouter J
Als een klasse een service is mag je alleen de benodigde dependencies injecteren, niet de hele container. Zodra de klasse dat niet is moet je de hele container injecteren (aangezien je van de klasse een service maakt zodra je depdencies injecteert)
Heel erg bedankt Wouter!