service container vraagje
Ik ben bezig een service container te maken.
Nu zit ik me af te vragen... ik wil in die container een method setService() maken. Is het oké als ik die method gebruik om direct een service te setten...
...of is het beter om een aparte class aan te maken waar ik die service in zet, en dat ik dan die class in de container stop? Dus ongeveer zoiets:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$service = new Service($class, $arguments);
public function setService($key, Service $service) {
// voer code uit
}
?>
$service = new Service($class, $arguments);
public function setService($key, Service $service) {
// voer code uit
}
?>
Toevoeging op 09/03/2013 21:39:15:
Ik vraag dit mede omdat in de tutorial (hier op phphulp) over dependency injection wordt gesproken over lazy loading. De objecten worden pas aangemaakt als ze worden opgevraagd. Zo worden er dus niet onnodig objecten aangemaakt.
Echter als ik nu voor iedere service een apart object aanmaak, verdwijnt bovengenoemd voordeel want dan "kost" iedere service minimaal 1 object en als de service wordt opgehaald zelfs 2.
Gewijzigd op 09/03/2013 21:39:47 door Ozzie PHP
Je kan toch de factory methode gebruiken die pim in ze tutorial beschrijft?
Het is gewoon wat je zelf leuk vind en handig vind. Pimple is een hele simpele container die niet heel veel kan, Symfony2 heeft een zeer uitgebreide container die het verplichte Service classen (Definitions noemen ze het volgens mij) te gebruiken.
@Wouter: oké thanks. Het kan dus beiden. Maar is het een "beter" OOP dan het ander? Of geldt ook hier weer dat er geen regels zijn? Is het zeg maar mooier dat de container zijn eigen services kan setten, of gebruik je daar een class voor en dat je die class als het ware "injecteert" in de container?
Symfony2 biedt je veel meer. Je kan bijv. een service taggen (en zo alle services ophalen die een 'form.type' tag hebben om zo alle form types te vinden). Hiervoor is de factory echt een eigen object geworden, een Definition.
Ook bied Symfony2 configuratie files aan voor services. Het gebruiken van een aparte factory object (Definition) is in zo'n geval handiger (let op: dus niet verplicht!!). Bijv:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
services:
acme.form.type.email:
class: Acme\FormBundle\Form\Type\EmailType
arguments: [@emailParser]
tags:
form.type: { name: 'email' }
acme.form.type.email:
class: Acme\FormBundle\Form\Type\EmailType
arguments: [@emailParser]
tags:
form.type: { name: 'email' }
Wordt in de parser omgebouwd tot:
Code (php)
Het gebruik van een Definition klasse is hierbij handiger en sneller dan om dit om te bouwen in een factory.
Dan ga ik het ook maar proberen met een aparte service class. Thanks! :)