service container vraagje

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ozzie PHP

Ozzie PHP

09/03/2013 21:36:32
Quote Anchor link
Ola mensen,

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...

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
public function setService($key, $class, $arguments) {
  // voer code uit
}
?>

...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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php

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

PHP hulp

19/04/2024 17:48:14
 
Tim S

Tim S

09/03/2013 21:57:14
Quote Anchor link
Je kan toch de factory methode gebruiken die pim in ze tutorial beschrijft?
 
Wouter J

Wouter J

09/03/2013 22:56:02
Quote Anchor link
De tweede methode (class) wordt gebruikt in de Symfony2 Dependency Injection Component en de eerste methode (factory) in Pimple.

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.
 
Ozzie PHP

Ozzie PHP

09/03/2013 23:05:05
Quote Anchor link
@Tim: bedoel je anonieme functies? Ik wil de services uit een configuratiebestand halen, dus dan gaat dat niet.

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

Wouter J

09/03/2013 23:15:26
Quote Anchor link
Naja, kijk, Pimple is gemaakt voor 2 dingen: waardes en factories. Of je slaat een waarde (property) op of een factory (een method/functie die een object aanmaakt). Hoe een service wordt geïnjecteerd (constructor, setter of property), welke services, ect. bepaald die factory allemaal, Pimple zal alleen die factory aanroepen.

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
services:
    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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$def
= new Definition(
    'Acme\FormBundle\Form\Type\EmailType',
    array(
        new
Reference('emailParser'),
    )
);

$def->addTag('form.type', array('name' => 'email'));

$container->setDefinition($def);
?>

Het gebruik van een Definition klasse is hierbij handiger en sneller dan om dit om te bouwen in een factory.
 
Ozzie PHP

Ozzie PHP

09/03/2013 23:20:19
Quote Anchor link
Ah oké, thanks voor de uitgebreide uitleg Wouter :-)

Dan ga ik het ook maar proberen met een aparte service class. Thanks! :)
 



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.