Je gebruikt het ook verkeerd. Pimple is niet één of andere globale registry die functies kan registreren. Iedere class heeft meestal wel dependencies. Bijv. een repository class; die heeft een database object nodig. Omdat het lastig is om iedere keer een database te initializen met de juiste parameters en die vervolgens in je repository te injecteren gebruiken we een DI container. Voorbeeldje:
[COLOR= #0000BB]<?php
$di[/COLOR][COLOR= #007700]->[/COLOR]set[COLOR= #007700]([/COLOR][COLOR= #DD0000]database[/COLOR][COLOR= #007700], function()
{[/COLOR]
[URL="http://www.php.net/return"]return[/URL] [COLOR= #007700]new[/COLOR] MySQL[COLOR= #007700]([/COLOR]xxx[COLOR= #007700]);
}[/COLOR]
?>
En nu kunnen we in onze code gewoon de db instance ophalen. Bijkomend voordeel is dat als je bijvoorbeeld wilt switchen van MySQL naar SQLite gewoon je class kan switchen (natuurlijk moet SQLite dan wel dezelfde methods hebben als MySQL, hier komen interfaces van te pas.)
Voorbeeldje met een repository:
[COLOR= #0000BB]<?php
$di[/COLOR][COLOR= #007700]->[/COLOR]set[COLOR= #007700]([/COLOR][COLOR= #DD0000]repository.user[/COLOR][COLOR= #007700], function()[/COLOR] use [COLOR= #007700]([/COLOR][COLOR= #0000BB]$di[/COLOR][COLOR= #007700]) {[/COLOR]
[URL="http://www.php.net/return"]return[/URL] [COLOR= #007700]new[/COLOR] UserRepository[COLOR= #007700]([/COLOR][COLOR= #0000BB]$di[/COLOR][COLOR= #007700]->[/COLOR]get[COLOR= #007700]([/COLOR][COLOR= #DD0000]database[/COLOR][COLOR= #007700]));
});[/COLOR]
?>
Nu kan de UserRepository gebruik maken van de database, en hoef je niet iedere keer een user repo te initializen als je die wilt gebruiken, en, als je je DB switched zal die ook worden geswitched voor de user repo.
DI wilt eigenlijk zeggen => dependency injection, je injecteert je dependencies ergens in. Een DI container is dan een container waar je je dependencies in injecteert.
Je kan dan je container meegeven aan andere delen van je applicatie; dan doe je zoiets:
[COLOR= #0000BB]<?php[/COLOR]
[URL="http://www.php.net/class"]class[/URL] UserController extends Controller
[COLOR= #007700]{[/COLOR]
[URL="http://www.php.net/private"]private[/URL] [COLOR= #0000BB]$users[/COLOR][COLOR= #007700];[/COLOR]
[URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] __construct[COLOR= #007700]([/COLOR]Container [COLOR= #0000BB]$container[/COLOR][COLOR= #007700])
{[/COLOR]
[COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]users [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]$container[/COLOR][COLOR= #007700]->[/COLOR]get[COLOR= #007700]([/COLOR][COLOR= #DD0000]repository.user[/COLOR][COLOR= #007700]);
}
}[/COLOR]
?>
Opgelet: dit is
verkeerd! Het is de bedoeling dat je de user repo injecteert in je class, en niet heel de DI container.
[COLOR= #0000BB]<?php
$di[/COLOR][COLOR= #007700]->[/COLOR]set[COLOR= #007700]([/COLOR][COLOR= #DD0000]controller.user[/COLOR][COLOR= #007700], function()[/COLOR] use[COLOR= #007700]([/COLOR][COLOR= #0000BB]$di[/COLOR][COLOR= #007700])
{[/COLOR]
[URL="http://www.php.net/return"]return[/URL] [COLOR= #007700]new[/COLOR] UserController[COLOR= #007700]([/COLOR][COLOR= #0000BB]$di[/COLOR][COLOR= #007700]->[/COLOR]get[COLOR= #007700]([/COLOR][COLOR= #DD0000]repository.user[/COLOR][COLOR= #007700]));
}[/COLOR]
[URL="http://www.php.net/class"]class[/URL] UserController
[COLOR= #007700]{[/COLOR]
[URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] __construct[COLOR= #007700]([/COLOR]UserRepository [COLOR= #0000BB]$users[/COLOR][COLOR= #007700]) {}
}[/COLOR]
?>
In je voorbeeld van sessie management kun je gebruiken maken van een sessie manager class; die je dan ook naar een interface kunt programmeren (sessies naar $_SESSION, een file, ...)
toevoeging op 3 december 2014, 16:45:28:Oja; als je nog vragen hebt: stel ze.