[oop] services... in de knoop

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2

Pim -

Pim -

24/09/2014 15:25:00
Quote Anchor link
Ik vind zelf de oplossing van Pimple mooi en simpel: services worden gedefinieerd met simpele factories in de vorm van een anonymous function. Deze krijgt dan als argument de container zelf mee, waardoor je zo beschikking hebt over al je afhankelijke services of parameters.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$container
['session_storage'] = function ($c) {
    return new SessionStorage('SESSION_ID');
};


$container['session'] = function ($c) {
    return new Session($c['session_storage']);
};

?>


Wat ik anders zou doen is het singleton maken van services (maar 1x instantiëren en daarna hetzelfde object teruggeven) default maken. Pimple doet dat zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$container
['session'] = $container->factory(function ($c) {
    return new Session($c['session_storage']);
});

?>

Zie ook: https://github.com/fabpot/Pimple#defining-services

Als je liever niet met anonymous functions werkt maar met de objecten zoals je in je voorbeeld gebruikt. Moet je misschien afstappen van de constructor gebruiken in je services en e.o.a. setup() functie in je interface definiëren, die als argument de container meekrijgt.
 
PHP hulp

PHP hulp

28/03/2024 19:53:19
 
Ozzie PHP

Ozzie PHP

24/09/2014 15:40:18
Quote Anchor link
Thanks Pim, leuk om je weer eens te zien hier :)

Ik ben inderdaad niet zo van de anonymous functions. In de "oude" situatie sloeg ik alle gegevens die ik nodig had om een service te maken op in een array binnen de container. Omdat alles in de container zat, konden de services onderling met elkaar "praten". Als ik van iedere service een los object maak, wat ik vervolgens aan de container toevoeg, dan is dat weliswaar een mooiere oplossing, maar de services kunnen niet meer met elkaar communiceren. Mijn idee was dat een service-object z'n eigen service kon teruggeven aan de container. Dus, stel ik heb een service-object A, dan vraag je dat via de container op, en het service-object geeft de service dan aan de container, en de container geeft het weer aan mij. Maar je hebt dan een probleem als service-object A een ander service-object (B) nodig heeft, want A en B kunnen niet bij elkaar komen.

Dit zou dus betekenen dat service-objecten niet hun eigen service kunnen aanmaken (want dat gaat blijkbaar niet werken) maar dat ze uitsluitend de instellingen van een service bevatten. De container, of een aparte processor, zou dan vervolgens een service moeten samenstellen. Maar dat betekent dus wel dat een service-object uitsluitend configuratie-gegevens vasthoudt en verder helemaal niks uitvoert. Is dat niet raar?
Gewijzigd op 24/09/2014 15:41:01 door Ozzie PHP
 
Wouter J

Wouter J

24/09/2014 20:02:13
Quote Anchor link
>> Is dat niet raar?

Nee, DTO's, Entities, ValueObjects. Allemaal voorbeelden van objecten die alleen data vasthouden. Als je een duidelijke separatie wilt hebben tussen je implementation en domain layer ga je heel veel van dit soort objecten gebruiken.
 
Ozzie PHP

Ozzie PHP

24/09/2014 20:04:49
Quote Anchor link
Hmmmm, oké... thanks. Ik moet nog even wennen aan het idee dat je dit in losse objecten stopt in plaats van in 1 grote array :) Maar als jij zegt dat dit de goede manier is, dan doen we het zo!
 

Pagina: « vorige 1 2



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.