Zitat von
lomex
Ich arbeite mich gerade in Contao 4 und Symfony ein.
Generell bleibe ich immer hängen bei der Frage, wann ich Services einsetzen soll?
Services haben ja den Vorteil, dass ich die Klassen leichter testen kann, in denen ich Services über den Konstruktor übergebe.
Soweit es sich um einen Service handelt, würde ich Services bevorzugen. Services sollten zustandslos sein. D.h. wenn du diesen mehrfach aufrufst, sollte er sich gleich verhalten.
Ob jetzt die Abhängikieten über den Konstruktur injected werden oder per Method Call, hängt davon ab ob die Abhängigkeit notwendig ist. Da du als Nutzer eines Services darauf vertrauen können sollst, dass dieser funktioniert, sind alle Abhängigkeiten im Konstruktor zu übergeben. Optionale Abhängigkeiten würde ich per Methode setzen. Alternativ, falls man unterschiedliche Optionen unterstützen möchte, kann die Abhängigkeit der Methode mitgegeben werden, die diese benötigt:
PHP-Code:
// Constructor injection
$repository = new MyRepository($databaseConnection);
// Optionale Abhängigkeit
$repository->setLogger($logger);
// Dependency Injection per Method call.
$model->changePassword('mySecretPasswort', $hashGenerator);
Zitat von
lomex
Nur viele Klassen verwenden hart verdrahtete Klasse per use. Siehe z.B. das Calender-Bundle und den GeneratePageListener.
Ist nur ein Beispiel.
Die Codebase von Contao ist (noch) nicht soweit, dass Sie als Best Practise gesehen werden kann. Oder etwas entschärft. Alle Klassen die unter src/Resources/contao liegen, würde ich nicht als Beispiele verwenden. Auch bei dem neuen Code gibt es ein paar Sachen, wo nicht alles sauber ist. Eine harte Verdrahtung ist dann z.b. sinnvoll, wenn du weißt, dass du immer diese Klasse nutzen möchtest. Sonst würde ich Depdendency Injection nutzen.
Zitat von
lomex
Generell die Frage, wann sollte ich Services einsetzen?
In diesem Beispiel gibt es einen Service und einen DataContainer. Warum doppelt gemoppelt? Was würde dagegen sprechen, alles in den Service zu packen?
Sollte nicht im Prinzip fast alles (außer die Controller und Events, die mir gerade einfallen) Services sein?
Wie oben schon genannt, würde ich möglichst vieles in Service laden. Ja, soweit wie möglich würde ich alles registrieren. Ausgeschlossen sind datenbezogene Objekte (DTOs, Events, Models, Commands (ich meine keine Symfony CLI-Commands)). Selbst Controller registriere ich als Service.
In Contao 4 kann man auch Hooks und DataContainer Callbacks als Services registrieren.
Grundsätzlich sollte man Klassen so konzipieren, dass Sie einen Zweck dienen. Ich tendiere inzwischen dazu für jeden einzelnen Hook eine Listener Klasse zu implementieren. Manchmal splitte ich auch die DataContainer Callback Klassen um an den oben genannten Beispielen zu bleiben.
Vielleicht hilft dir das weiter.
Lesezeichen