[di] nut van aware classen?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

- Raoul -

- Raoul -

02/02/2013 10:30:18
Quote Anchor link
Hoi,

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
 
PHP hulp

PHP hulp

28/11/2024 12:05:27
 
Wouter J

Wouter J

02/02/2013 12:34:26
Quote Anchor link
Altijd handig om erin te hebben. Je krijgt dan een goed overzicht wie welke dependency heeft. Ook heb ik pas een Depdency Container gemaakt die hiermee kan omgaan dus automatisch al JouwKlasse::setEventDispatcher() aanroept zodra hij EventdispatcherAwareInterface implementeert. Zie voor meer info: https://github.com/WouterJ/dic/blob/master/doc/interfaces.md
 
- Raoul -

- Raoul -

02/02/2013 12:42:21
Quote Anchor link
Thanks voor je reactie. Heb nu zoiets:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php

public function getEventManager()
{

    return $this->container['event_manager'];
}


?>


Zoiets vind ik dan nog steeds mooier dan gewoon raw ->get('event_manager') te callen.
 
Wouter J

Wouter J

02/02/2013 19:14:39
Quote Anchor link
Wat jij nu hebt hoort niet. Als het goed is injecteer je altijd alleen services die nodig zijn, nooit de hele container.
 
- Raoul -

- Raoul -

02/02/2013 19:16:15
Quote Anchor link
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?
 
Wouter J

Wouter J

02/02/2013 19:17:37
Quote Anchor link
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.
 
- Raoul -

- Raoul -

02/02/2013 19:19:46
Quote Anchor link
Ik snap het principe rond services nog niet echt. Waarom moet een service (bv. Router) de Service class extenden? Alles staat toch al in het config bestand?
Gewijzigd op 02/02/2013 19:21:41 door - Raoul -
 
Wouter J

Wouter J

02/02/2013 19:27:37
Quote Anchor link
Als je blieft niet extenden :-).

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
services:
    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)
 
- Raoul -

- Raoul -

02/02/2013 19:45:53
Quote Anchor link
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?
 
Wouter J

Wouter J

02/02/2013 19:46:33
Quote Anchor link
Ja
 
- Raoul -

- Raoul -

02/02/2013 19:52:04
Quote Anchor link
Bedankt! Als ik nog vragen heb zal ik ze hier plaatsen.

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?
 
Wouter J

Wouter J

02/02/2013 19:59:08
Quote Anchor link
Kun je je vraag iets verduidelijken?
 
- Raoul -

- Raoul -

02/02/2013 20:02:38
Quote Anchor link
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

Wouter J

02/02/2013 20:11:16
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
services:
    session.storage:
        class: Raoul\Framework\Storage\SessionStorage

    controller.home:
        class: Raoul\Controller\HomeController
        arguments: [@session.storage]
 
- Raoul -

- Raoul -

02/02/2013 20:13:20
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
services:
    session.storage:
        class: Raoul\Framework\Storage\SessionStorage

    controller.home:
        class: Raoul\Controller\HomeController
        arguments: [@session.storage]

Maar ik ga toch niet voor iedere controller een service maken?
 
Wouter J

Wouter J

02/02/2013 20:17:46
Quote Anchor link
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
 
- Raoul -

- Raoul -

02/02/2013 20:19:31
Quote Anchor link
Dus, stel nu ik wil toch nog steeds een storage.session in m'n controller, dan mag ik dus gewoon dit doen:
http://www.phphulp.nl/php/forum/topic/di-nut-van-aware-classen/89011/#639050
 
Wouter J

Wouter J

02/02/2013 20:23:56
Quote Anchor link
Ja, dat klopt. De basis regel:
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)
 
- Raoul -

- Raoul -

02/02/2013 20:29:13
Quote Anchor link
Heel erg bedankt Wouter!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.