Hallo,

Ik heb weer even een OOP vraag.

Ik heb een container die services bevat. Heel simplistisch gesteld vraag ik aan de container een ID op, en dan krijg ik een (geconfigureerd) object terug. De verdere werking is voor mijn vraag niet echt relevant. Voorbeeldje:

<?php
$mailer = $container->get('mailer');
?>
Wat ik op dit moment doe is (zeer vereenvoudigd!) dit:

Ik heb een configuratie-bestand waar ik de ID's en de (geconfigureerde) objecten in zet:


Foo
  class: Foo
  
Bar
  class: Bar
  parameters:
    foobar: true

Nogmaals, het is allemaal wat versimpeld, maar het gaat om het globale idee.

Ik laad het configuratie-bestand in als een array en sla de gegevens rechtstreeks op in een class property (array) van de container class. En dit is waar mijn vraag vooral over gaat. Ik sla de gegevens dus op in een class property, en als ik een service (object) nodig heb dan wordt deze aan de hand van de gegevens uit de array geconstrueerd.

Schematisch:


$container->addConfig($config); // $config zijn de gegevens uit het config-bestand
$foo = $container->get('foo');

De vraag is of ik de gegevens uit het config-bestand direct in een class property (array) moet zetten, of dat het beter is om van ieder configuratie "item" een apart object te maken en deze aparte objecten op te slaan in een class property?

Ik kan me voorstellen dat het best lastig is om te volgen wat ik bedoel, maar ik hoop dat iemand het begrijpt.

Als ik de vraag heel plat stel, dan is eigenlijk de vraag: kan ik de array met configuratiegegevens in 1 keer in z'n totaliteit in een class property stoppen? Of is het de bedoeling dat ik van ieder element in de array een object maak, en dat ik al die afzonderlijke objecten toevoeg aan de class property in de container?

Nu doe ik zeg maar (weer even heel erg versimpeld) dit:

<?php
class Container {

private $config;

public function addConfig(array $config) {
$this->config = array_merge($this->config, $config);
}

public function get($id) {
$class = $this->config[$id]['class'];
return new $class;
}

}
?>
Is dit een goede manier? Of is eerder dit de bedoeling:

<?php
class Container {

private $config;

public function addConfig(array $config) {
foreach ($config as $id => $service_config) {
$this->config[$id] = new Service($service_config);
}
}

public function get($id) {
$class = $this->config[$id]->getClass();
return new $class;
}

}
?>
Het verschil zit 'm er dus in dat ik in de eerste situatie geen gebruik maak van afzonderlijke objecten (de informatie komt rechtstreeks uit de array), en in de 2e situatie wel.

Welke van deze 2 opties is de juiste OOP gedachtengang? Optie 1 of optie 2?
Ozzie, SL (Service Locator) pattern geldt wanneer je de container injecteert in een class i.p.v. alleen de services die je nodig hebt.
Ah oké, maar dat is niet echt de bedoeling lijkt me.
Nee, daarom is het ook een anti pattern :)
hehe... oke :)
Gelukkig wordt alle materie in balans gehouden door antimaterie.

Hehe... en welke wijze les kunnen we daar dan uit trekken Ward?
Nou, zijdelings raakt D Vivendi wel aan een punt...

Stel dat je PSR-compatibele namespaces met een bijbehorende PSR-compliant autoloader hebt. Dan kan elke PHP-applicatie redelijk trefzeker elke beschikbare klasse uit een namespace laden.

Dat staat lijnrecht tegenover de servicecontainer waarin je gericht specifieke services voor specifieke applicaties beschikbaar stelt.

Beetje theoretisch en opzettelijk overdreven, maar die tegenstelling is wel interessant.
[offtopic]Ward, maar als antimaterie en materie bij elkaar komen wordt het 0 en dat wil je niet in je code. Als er bij het ontstaan van het heelal niet net iets meer materie was dan antimaterie (het is nog vaag waarom er wel meer antimaterie is) was er geen heelal geweest. :)[/offtopic]
[offtopic]No, no different.
Only different in your mind.
You must unlearn what you have learned.[/offtopic]
Geen alcohol meer voor jullie vanavond!

Reageren