Ankündigung

Einklappen
Keine Ankündigung bisher.

Front Controller- Router

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    Natürlich, ein Dispatcher verfügt nicht über Registry-Fähigkeiten oder implementiert das Container Pattern. Warum ? Single Responsibility Principle.
    [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


    • #17
      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


      • #18
        Zitat von rkr Beitrag anzeigen
        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. Nur in der Konfigurationsphase.
        Nein, genau genommen kann man sagen das weder PHP-DI noch Laravel's IoC einen Dunst auf Aufgaben-Trennung geben. Ein DI-Container der aktuell das Single Responsibility Prinzip einhält ist Pimple. Beide sind Class Resolver, Container und Dependency Builder in einem.

        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


        • #19
          Was interessiert es mich als anwendender Entwickler auf Grund welcher Konvention ein Tool geschrieben wurde, das für meine Applikation praktisch unsichtbar ist?

          Kommentar


          • #20
            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


            • #21
              Genau. Du kannst sie auch komplett gegen eine andere ersetzen, wenn du einen adäquaten Ersatz findest.

              Kommentar


              • #22
                Werden 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

                Kommentar


                • #23
                  Zitat von Carpenter Beitrag anzeigen
                  Werden 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
                  Klingt nach der Frage ob Controller aus der Mode gekommen sind. Ich sage nein, Controller sind "heute" allerdings ein Gruppierungswerkzeug um Actions zu gruppieren.
                  [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


                  • #24
                    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 $serviceXServiceY $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'));
                        }

                    Ich übergebe meinetwegen Lazy die Services in den Controller per constructor injection.

                    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 $dtoServiceX $serviceX) {
                            
                    $this->dto $dto;
                            
                    $this->serviceX $serviceX;
                        }
                        
                        public function 
                    execute() {
                            
                    $this->serviceX->do($this->dto->getId());
                            return new 
                    Response('foo');
                        }
                        

                    Aufgelöst wird das ganze dann vom CommandResolver und der Factory.

                    Viele Grüße
                    Carpenter

                    Kommentar


                    • #25
                      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 $userDataValidationServiceInterface $validator){
                              
                      $validator->validate(User::class, $userData);
                          }

                      Es kommt natürlich auf das Projekt an, aber ich habe teilweise auch sehr kleine Controller mit vielleicht 5 übersichtlichen Methoden. Diese nun in 5 Klassen zu splitten, wäre mir ehrlich gesagt zu viel des Guten.

                      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


                      • #26
                        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


                        • #27
                          Hallöchen,

                          Zitat von Carpenter Beitrag anzeigen
                          irgendwie verstoßen Controller doch dann auch gegen solid oder?
                          Sie haben für mich dann mehrere Kompetenzen, wenn sie mehrere Actions beinhalten.
                          Im Prinzip hast du Recht. In der Theorie gibt es haufenweise Fälle, die man in atomare Prozesse zerlegen sollte. So sehr ich auch ein großer Fan von sauberer Software-Architektur bin, so sehr zeigt sich in der Praxis, dass man schnell Over-Engineering betriebt, wenn man allen bewährten Prinzipien gerecht werden möchte. Ich denke solange die Controller so aufgebaut sind, dass das Refactoring kein Problem darstellt, kann man jederzeit, wenn es nötig wird, die Strukturen umbauen. Bei dem von mir genannten Beispiel müsste ich einfach eine neue Klasse erstellen, die Dependencies in den Konstruktor packen und die Konfiguration der Route ändern. Fertig ist das Ding ausgelagert.

                          Zitat von Carpenter Beitrag anzeigen
                          Wahrscheinlich hast du aber recht, man muss es nicht immer in jedem Projekt übertreiben. Es kommen schon recht viele Klassen dabei raus.
                          So ist es. So flexibel wie nötig, so simpel wie möglich.

                          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


                          • #28
                            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


                            • #29
                              Hallöchen,

                              Zitat von tr0y Beitrag anzeigen
                              Es gäbe da ja noch Closure-Binding im Bezug auf Actions und Action Collections ( Controller ).
                              Klingt hot. Beispiel her!

                              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


                              • #30
                                Zitat von lottikarotti Beitrag anzeigen
                                Hallöchen,

                                Klingt hot. Beispiel her!

                                Viele Grüße,
                                lotti
                                PHP-Code:
                                <?php

                                class ActionFacade {
                                    
                                    public function 
                                __construct(ServiceContract $servicesRepositoryContract $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 $requestRoutePropertyContract $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

                                Lädt...
                                X