Hallo, ich habe eine Frage bzgl. Software-Design. Und zwar: Ich habe viele Komponenten (Routing, Form Validation, ...) wie bei einem professionellen Framework im Einsatz. Meine Frage zielt darauf ab, wie ich nun die Komponenten am Besten miteinander verdrahte und die Applikation als "Solches" zum Laufen bringe. Eignet sich dafür eine Art "God-Klasse" am Besten, die wie eine Fassade fungiert und alle Komponenten miteinander verdrahtet, und dann in einer Datei instanziiert wird und mit einer Methode zum Laufen gebracht wird. Ich glaube Symfony macht das so. Ich möchte einfach sauber voneinander trennen, habe aber beim "Zusammenbauen" der Applikation noch Bauchschmerzen, nachdem ich die Komponenten sauber voneinander getrennt und entsprechend abstrahiert habe. Würde mich über jeden konstruktiven Beitrag sehr freuen.
Ankündigung
Einklappen
Keine Ankündigung bisher.
Applikation "verdrahten"
Einklappen
Neue Werbung 2019
Einklappen
X
-
Zitat von engineer Beitrag anzeigenDa hab ich mir selbst nen DI-Container geschrieben. Die Frage zielte eher darauf ab, wie das Klassentechnisch bewerkstelligt werden soll. Wird dass dann alles in "einer" Klasse gemacht, die wie eine Art Fassade fungiert?
Bei einem DI-Container hast du eigentlich nur zwei strategische Punkte, wo du mit dieser "Fassade" in Berührung kommst: Den Bootstrap und Factories.
Nehmen wir mal an, dass wir folgende Klassen haben (verzeih die Schreibweise; Das ist Quasi-Scala, was ich jetzt nur wegen der kompakten Schreibweise wähle):
PHP-Code:class TransactionReader(string $endpoint, HttpClient $client) {
public function getTransactions(DateTimeInterface $startDate, DateTimeInterface $endDate): XMLNode[] {
$data = $client->post($endpoint, ['startDate' => $startDate->format('c'), 'endDate' => $startDate->format('c')]);
$xml = new XMLDoc($data);
foreach($xml \\ "Orders" as $order) yield $order
}
}
class TransactionConverter(Hydrator $hydrator) {
public function convert(XMLNode $order) = $hydrator->hydrate($order, Transaction::class);
}
class Transactions(TransactionReader $reader, TransactionConverter $converter) {
public function getTransactions(DateTimeInterface $startDate, DateTimeInterface $endDate): Transaction[] {
$transactions = $reader->getTransactions($startDate, $endDate);
foreach($transactions as $transaction) yield $converter->convert($transaction);
}
}
Deine di-config sähe in diesem Fall ohne näheres Wissen, wei ein Hydrator oder ein HttpClient erzeugt wird so aus:
PHP-Code:<?php
return [
'api.endpoint' => 'http://...',
HttpClient::class => /* ... */,
Hydrator::class => /* ... */,
TransactionReader::class => object()
->constructorParameter('endpoint', link('api.endpoint'))
];
PHP-Code:class MyController(Config $config, Transactions $transactions) {
public function storeNewTransactions() {
$lastStartDate = $config->get('last-order-start-date', new DateTime('-1 month')->format('c'));
/* ... */
}
}
PHP-Code:$ctrl = $container->get(MyController::class);
$ctrl->storeNewTransactions();
Kommentar
Kommentar