Natürlich, ein Dispatcher verfügt nicht über Registry-Fähigkeiten oder implementiert das Container Pattern. Warum ? Single Responsibility Principle.
Ankündigung
Einklappen
Keine Ankündigung bisher.
Front Controller- Router
Einklappen
Neue Werbung 2019
Einklappen
X
-
[URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].
-
Sehr professionelle Antwort, Herr Kollege.
Also kann man Zusammenfassend sagen, dass PHP-DI sehr wohl ein exzellenter Dispatcher ist, der dazu noch Autowiring unterstützt und daher auch diese Registry benötigt. Für den normalen Entwickler hat PHP-DI genau zwei Zuständigkeiten (neben der Konfiguration der Abhängigkeiten, was ja sowieso gemacht werden muss):
- Erstellung und Aufruf der Startmethode im Frontcontroller.
- Erzeugung neuer Objekte in einer Factory.
Von dort an muss man sich nie mehr drum kümmern, selbst einen Constructor in mitten seiner Applikation zu befüllen.
Kommentar
-
Zitat von rkr Beitrag anzeigenSehr professionelle Antwort, Herr Kollege.
Also kann man Zusammenfassend sagen, dass PHP-DI sehr wohl ein exzellenter Dispatcher ist, der dazu noch Autowiring unterstützt und daher auch diese Registry benötigt. Für den normalen Entwickler hat PHP-DI genau zwei Zuständigkeiten (neben der Konfiguration der Abhängigkeiten, was ja sowieso gemacht werden muss):
- Erstellung und Aufruf der Startmethode im Frontcontroller.
- Erzeugung neuer Objekte in einer Factory.
Von dort an muss man sich nie mehr drum kümmern, selbst einen Constructor in mitten seiner Applikation zu befüllen. Nur in der Konfigurationsphase.
Wenn bei dir Single Responsibility bei der Fassade einer Aufgabenstellung aufhört ist das nicht mein Problem.[URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].
Kommentar
-
Mich interessiert es spätestens dann wenn ich das "tool" ( die Komponente ) anpassen will.[URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].
Kommentar
-
Zitat von Carpenter Beitrag anzeigenWerden Controller überhaupt noch verwendet?
Wir sind bereits seit einiger Zeit auf Commands und CommandHandler umgestiegen (1 Aktion 1 Klasse), weil die verschiedenen Actions und deren Abhängigkeiten im Controller irgendwann zu viel wurden.
Viele Grüße
Carpenter[URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].
Kommentar
-
Ich weiß nicht wie ihr eure Controller so umsetzt. Für mich hat es nichts mit einer Modeerscheinung zu tun.
Nachfolgend ein Problem was ich an Controllern sehe.
PHP-Code:class FooController extends Controller {
public function __construct(ServiceX $serviceX, ServiceY $serviceY) {
$this->serviceX = $serviceX;
$this->serviceY = $serviceY;
}
public function executeIndex(Request $request) {
$this->serviceX->do($request->get('id'));
}
public function executeEdit(Request $request) {
$this->serviceY->do($request->get('id'));
}
}
die index action benötigt aber nur einen der übergebenen Services. Wenn ich jetzt noch mehr Actions hätte, würde sich das ganze doch schon recht aufblähen.
Wir haben uns dann mit thephp.cc zusammen gesetzt, die uns folgenden Lösungsansatz beigebracht haben.
PHP-Code:class LoginDto implements Command {
const PARAMETER_ID = 'idField';
public function __construct($id) {
$this->id = $id;
}
// request / route parameter
static public function fromHttpRequest(HttpRequestInterface $request, array $parameters = array()) {
$id = $parameters[self::PARAMETER_ID];
return new self($id);
}
}
class LoginCommandHandler implements CommandHandler {
public function __construct(LoginDto $dto, ServiceX $serviceX) {
$this->dto = $dto;
$this->serviceX = $serviceX;
}
public function execute() {
$this->serviceX->do($this->dto->getId());
return new Response('foo');
}
}
Viele Grüße
Carpenter
Kommentar
-
Hallöchen,
da meine Controller-Methoden ebenfalls automatisiert mit Abhängigkeiten gefüttert werden, kann ich diese in Einzelfällen auch dort angeben wo ich sie brauche:
PHP-Code:class UserController{
protected $users = null;
public function __construct(UserRepositoryInterface $users){
$this->users = $users;
}
public function store(array $userData, ValidationServiceInterface $validator){
$validator->validate(User::class, $userData);
}
}
Viele Grüße,
lotti[SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]
Kommentar
-
Hallo,
irgendwie verstoßen Controller doch dann auch gegen solid oder?
Sie haben für mich dann mehrere Kompetenzen, wenn sie mehrere Actions beinhalten.
Wahrscheinlich hast du aber recht, man muss es nicht immer in jedem Projekt übertreiben. Es kommen schon recht viele Klassen dabei raus.
Viele Grüße
Carpenter
Kommentar
-
Hallöchen,
Zitat von Carpenter Beitrag anzeigenirgendwie verstoßen Controller doch dann auch gegen solid oder?
Sie haben für mich dann mehrere Kompetenzen, wenn sie mehrere Actions beinhalten.
Zitat von Carpenter Beitrag anzeigenWahrscheinlich hast du aber recht, man muss es nicht immer in jedem Projekt übertreiben. Es kommen schon recht viele Klassen dabei raus.
Viele Grüße,
lotti[SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]
Kommentar
-
Es gäbe da ja noch Closure-Binding im Bezug auf Actions und Action Collections ( Controller ).[URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].
Kommentar
-
Hallöchen,
Zitat von tr0y Beitrag anzeigenEs gäbe da ja noch Closure-Binding im Bezug auf Actions und Action Collections ( Controller ).
Viele Grüße,
lotti[SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]
Kommentar
-
Zitat von lottikarotti Beitrag anzeigenHallöchen,
Klingt hot. Beispiel her!
Viele Grüße,
lottiPHP-Code:<?php
class ActionFacade {
public function __construct(ServiceContract $services, RepositoryContract $repositories)
{
# ...
}
public function repository($name)
{
# ...
}
public function service($name)
{
# ...
}
public function redirect($target)
{
# ...
}
public function response($body, array $headers = [], $contentType = 'text/html', $statusCode = 200)
{
# ...
}
}
$fooAction = function(RequestContract $request, RoutePropertyContract $route)
{
$something = $this->service('something',['foo' => 12345, 'bar' => 'baz']);
$something->send($request->get('that', null), $route->get('id'));
return $this->response($this->service('twig')->render('foo.twig', $something->getResult()));
};
$actionFacade = $someDIC->make(ActionFacade::class);
$concreteAction = $fooAction->bindTo($actionFacade);
$someDIC->call($concreteAction);[URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].
Kommentar
Kommentar