Ankündigung

Einklappen
Keine Ankündigung bisher.

Silex / ServiceProvider Konzept

Einklappen

Neue Werbung 2019

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

  • #16
    Okay dann hier ein erschlagendes Argument: Frameworks sind, wie das Wort schon sagt, ein Grundgerüst für eine Anwendung. Wie weit Idioten-sicher diese von den Author(en) konzipiert sind hängt davon ab was das Framework am Ende leisten oder ermöglichen soll ( Intention / Designentscheidung ). Nutzer die sich mit dem Framework auseinandersetzen kommen entweder mit der Designentscheidung klar oder lehnen das Framework aus spezifischen Gründen ab.

    Ich gehöre zu ersteren und bin der Lage einfach und ohne hohen Aufwand die nötigen Sicherheitsmechanismen zu implementieren ohne dabei das Grundkonzept der Dependency-Verwaltung von Silex in der Luft zerreißen zu müssen, nur weil sie ungewohnt offen definiert wurde.

    Silex verletzt keine dieser Prinzipien, wenn schon Pimple und das auch nur ohne dein dazutun.

    Frameworks sind Frameworks und fußen auf logische Designentscheidungen. Wer etwas erwartet das nicht teil des Frameworks ist sollte sich entweder die Mühe machen und diesen Teil dem Framework beisteuern und ein Core-Commit absetzen oder es lassen. Silex ist ja nicht gerade erst 3 Wochen draußen und du bist mit sehr hoher Wahrscheinlichkeit auch nicht der erste der sich diese Konzept-Frage gestellt hat.

    Es gibt genug andere alternativen die das Verhalten der Dependency-Container in Stein meißeln, da dann irgendetwas dran zu verändern ist meist mangels fehlender Modularität unmöglich.

    Ich einige mich mit mir selbst darauf das du das ganze Thema mit einer Art Tunnelblick siehst und etwas voreingenommen an das Thema herangehst.
    [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
      Ich persönliche habe das am Anfang genau so gesehen wie jack88. Durch eine längere Diskussion mit tr0y in Facebook muss ich tr0y allerdings Recht geben! Pimple verletzt deine Aussagen, nicht Silex.

      Kommentar


      • #18
        Zitat von jack88 Beitrag anzeigen
        Das ist eine ziemlich merkwürdige Art zu argumentieren.

        Wenn ich ein Framework hätte, bei dem es viele globale Variablen gibt und ich es damit begründe, daß es die Intention von diesem Framework ist Variablen so einfach wie möglich verfügbar zu machen, dann wäre das also ok?

        - sind globale Variblen grundsätzlich schlecht,
        - ist Datenkapselung grundsätzlich gut,
        - ist das Open-Closed-Prinzip grundsätzlich gut,

        oder hängt es letztendlich von der "Intention" ab?

        Sollen wir das alles jetzt in Frage stellen, oder können wir uns darauf einigen , daß diese Prinzipien gelten?

        Verletzt Silex diese Prinzipien? Ich meine JA und zwar alle drei.

        Ist das gut, profitiert irgendjemand von der Verletzung der o.g. Prinzipien?

        vg
        jack
        du hast mein Beitrag von vorhin ignoriert,

        globale variablen sind schlecht, aber $app ist nicht global, du musst es schon weitergeben damit es an anderer stelle wiederverwendet werden kann. wenn man es falsch macht, dann übergibt man $app an jedes objekt weiter, wenn man es richtig macht, übergibt man nur bestimmte elemente von $app weiter.

        Datenkapselung hat nichts mit dem zugriff auf $app['keyname'] zu tun, datenkapselung bedeutet ledeglich dass du bestimmte eigenschaften/methoden für die außenwelt nicht sichtbar machst durch private/protected

        Open Closed prinzip bezieht sich wieder auf einzelne klassen und nicht auf die gesamte architektur.

        schaust du dir mal andere Frameworks an, egal welche, haben diese auch Globale variablen die in dem sogenannten "BaseController" sich befinden. Du kannst argumentieren dass die nur innerhalb der Controller sichtbar sind die von denen abgeleitet werden, fakt ist, die sind global in allen controllern verfügbar. Wenn du zugriff auf diese Eigenschaften und Methoden haben willst, musst du vom Base Controller ableiten, es ist im grunde das gleiche wie mit der $app du kommst nicht drumherum einige eigenschaften, global zur verfügung zu stellen um auf diese zugreifen zu können.

        Einige größere Frameworks haben sogar klassen die final sind, und diese verletzten das Open Closed Prinzip auch, aber, an einigen stellen muss es halt so sein.

        Es wäre halt im Endeffekt irrelevant wenn du eigenschaften des $app arrays irgendwie blockieren würdest, weil du sowieso bei der verwendung , interfaces einbauen solltest. Wenn du dann versuchst eine instanz von irgendwas zu erstellen wird es schon vorher krachen und wird nicht zu unerwünschter funktionialität führen.

        Du hast zb den Session Handler bemängelt, aber du hast es dir nicht genauer angesehen.

        https://github.com/silexphp/Silex/bl...ovider.php#L59

        da werden "globale" objekte weitergegeben, aaaber
        https://github.com/symfony/symfony/b....php#L374-L379

        hier ist der check, ob man auch die richtigen objekte übergeben hat und das ist bei allen service providern so, statt den check der strings zu machen, verlässt man sich auf interfaces.
        apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

        Kommentar


        • #19
          @troy
          das du das ganze Thema mit einer Art Tunnelblick siehst und etwas voreingenommen an das Thema herangehst
          Schon mal die Möglichkeit in Betracht gezogen, daß es auch genau andersrum sein könnte?

          @jprangenberg
          Pimple verletzt deine Aussagen, nicht Silex.
          Pimpel ist nicht das Problem, denn Pimpel tut genau das wofür es entwickelt wurde. Pimpel ist nur ein einfaches Werkzeug, welches erst durch Silex zum Framework mutiert.

          Wenn ich mit einer Brechstange eine Scheibe einschlage, ist dann die Brechstange schuld?

          @BlackScorp

          globale variablen sind schlecht, aber $app ist nicht global,
          Global bezog sich auf meine folgende Aussage:

          Damit mutiert die Application mit jedem weiteren Service zu einem globalen Storage für alle Services und alle die internen Serviceparameter. Kapselung der Daten – Fehlanzeige, Schutz der Daten – Fehlanzeige!�*
          Datenkapselung hat nichts mit dem zugriff auf $app['keyname'] zu tun, datenkapselung bedeutet ledeglich dass du bestimmte eigenschaften/methoden für die außenwelt nicht sichtbar machst durch private/protected

          Open Closed prinzip bezieht sich wieder auf einzelne klassen und nicht auf die gesamte architektur.
          $app ist eine Instanz der Klasse Silex\Appication. Es ist nur ein Objekt, sogar ein sehr wichtiges. Andere Objekte kommunizieren mit diesem Objekt und können es jederzeit, auch unabsichtlich derart beschädigen, daß dieses Objekt seine Arbeit nicht mehr verrichten kann. Das wichtigste Objekt der gesamten Applikation ist allen anderen Objekten komplett schutzlos ausgeliefert. Für mich ein absolutes No-Go, gegen jede Vernunft und nicht in Einklang mit den elementarsten Prinzipien von OOP zu bringen!

          Du hast zb den Session Handler bemängelt, aber du hast es dir nicht genauer angesehen.
          Ich habe schon sehr genau hingesehen:

          PHP-Code:
          <?php

          /*
           * This file is part of the Silex framework.
           *
           * (c) Fabien Potencier <fabien@symfony.com>
           *
           * For the full copyright and license information, please view the LICENSE
           * file that was distributed with this source code.
           */

          namespace Silex\Provider;

          use 
          Silex\Application;
          use 
          Silex\ServiceProviderInterface;
          use 
          Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeFileSessionHandler;
          use 
          Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
          use 
          Symfony\Component\HttpFoundation\Session\Storage\MockFileSessionStorage;
          use 
          Symfony\Component\HttpFoundation\Session\Session;
          use 
          Symfony\Component\HttpFoundation\Cookie;
          use 
          Symfony\Component\HttpKernel\HttpKernelInterface;
          use 
          Symfony\Component\HttpKernel\KernelEvents;
          use 
          Symfony\Component\HttpKernel\Event\FilterResponseEvent;
          use 
          Symfony\Component\HttpKernel\Event\GetResponseEvent;

          /**
           * Symfony HttpFoundation component Provider for sessions.
           *
           * @author Fabien Potencier <fabien@symfony.com>
           */
          class SessionServiceProvider implements ServiceProviderInterface
          {
              private 
          $app;

              public function 
          register(Application $app)
              {
                  
          $this->app $app;

                  
          $app['session.test'] = false;

                  
          $app['session'] = $app->share(function ($app) {
                      if (!isset(
          $app['session.storage'])) {
                          if (
          $app['session.test']) {
                              
          $app['session.storage'] = $app['session.storage.test'];
                          } else {
                              
          $app['session.storage'] = $app['session.storage.native'];
                          }
                      }

                      return new 
          Session($app['session.storage']);
                  });

                  
          $app['session.storage.handler'] = $app->share(function ($app) {
                      return new 
          NativeFileSessionHandler($app['session.storage.save_path']);
                  });

                  
          $app['session.storage.native'] = $app->share(function ($app) {
                      return new 
          NativeSessionStorage(
                          
          $app['session.storage.options'],
                          
          $app['session.storage.handler']
                      );
                  });

                  
          $app['session.storage.test'] = $app->share(function () {
                      return new 
          MockFileSessionStorage();
                  });

                  
          $app['session.storage.options'] = array();
                  
          $app['session.default_locale'] = 'en';
                  
          $app['session.storage.save_path'] = null;
              }

              public function 
          onEarlyKernelRequest(GetResponseEvent $event)
              {
                  
          $event->getRequest()->setSession($this->app['session']);
              }

              public function 
          onKernelRequest(GetResponseEvent $event)
              {
                  if (
          HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
                      return;
                  }

                  
          // bootstrap the session
                  
          if (!isset($this->app['session'])) {
                      return;
                  }

                  
          $session $this->app['session'];
                  
          $cookies $event->getRequest()->cookies;

                  if (
          $cookies->has($session->getName())) {
                      
          $session->setId($cookies->get($session->getName()));
                  } else {
                      
          $session->migrate(false);
                  }
              }

              public function 
          onKernelResponse(FilterResponseEvent $event)
              {
                  if (
          HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
                      return;
                  }

                  
          $session $event->getRequest()->getSession();
                  if (
          $session && $session->isStarted()) {
                      
          $session->save();

                      
          $params session_get_cookie_params();

                      
          $event->getResponse()->headers->setCookie(new Cookie($session->getName(), $session->getId(), === $params['lifetime'] ? time() + $params['lifetime'], $params['path'], $params['domain'], $params['secure'], $params['httponly']));
                  }
              }

              public function 
          boot(Application $app)
              {
                  
          $app['dispatcher']->addListener(KernelEvents::REQUEST, array($this'onEarlyKernelRequest'), 128);

                  if (
          $app['session.test']) {
                      
          $app['dispatcher']->addListener(KernelEvents::REQUEST, array($this'onKernelRequest'), 192);
                      
          $app['dispatcher']->addListener(KernelEvents::RESPONSE, array($this'onKernelResponse'), -128);
                  }
              }
          }
          Alle session.variable Variablen (session.storage.options, session.default_locale. session.storage.save_path, session.listener etc) landen im globalen Namensraum der Applikation $app['...']. Die app braucht diese Parameter ohnehin nicht, denn diese sind ausschließlich für den SessionService bestimmt. Hier wird die App einfach als globales Storage für alle möglichen Parameter von allen möglichen Services missbraucht. Ganz ganz schlechtes Software-Design und völlig unnötig auch noch dazu.

          Bei jeder „normalen“ Klasse wird i.d.R. versucht alle Properties zu schützen und den Zugriff so zu definieren, damit keine unerlaubten Werte reinkommen und die Objekte nicht in einen inkonsistenten Zustand geraten können. Bei einer Klasse die die gesamte Applikation repräsentiert, soll das aber nicht nötig oder zu umständlich sein? Was ist das für eine Logik?

          vg
          jack
          -

          Kommentar


          • #20
            ja $app ist eine instanz von SilexApplication, aber $app['irgendwas'] ist ledeglich ein wert im SplObjectStorage

            Alle session.variable Variablen (session.storage.options, session.default_locale. session.storage.save_path, session.listener etc) landen im globalen Namensraum der Applikation $app['...']. Die app braucht diese Parameter ohnehin nicht, denn diese sind ausschließlich für den SessionService bestimmt.
            relevant ist doch das, was du am Ende benutzt, wenn man es so haben will, landet jede variable in den Globalen Speicher des PHP Interpreten damit du auf diese variable zugreifen kannst.

            Das wichtigste Objekt der gesamten Applikation ist allen anderen Objekten komplett schutzlos ausgeliefert. Für mich ein absolutes No-Go, gegen jede Vernunft und nicht in Einklang mit den elementarsten Prinzipien von OOP zu bringen!
            das ist $_POST, $_GET, $_SERVER etc auch, dennoch baut man klassen drumherum.

            Der vorteil ist ja, wenn ich keine lust habe auf den SessionServiceProvider und möchte gerne einen eigenen nutzen, kann ich das jederzeit mit wenig aufwand machen.

            generell $app hat geschützte properties und methoden nach dem OOP prinzip, $app['key'] befindet sich aber in einer eigenen instanz, will sagen dass $app gehört zu silex und die keys zu Pimple.

            Bei jeder „normalen“ Klasse wird i.d.R. versucht alle Properties zu schützen und den Zugriff so zu definieren, damit keine unerlaubten Werte reinkommen und die Objekte nicht in einen inkonsistenten Zustand geraten können
            tjoa in PHP ist es aber nicht so du kannst strings statt zahlen einfach strings übergeben und php wird es verarbeiten, das objekt könnte dennoch inkosistent sein.

            Ich habe schon sehr genau hingesehen:
            dann ist dir wohl nicht aufgefallen, dass JEDE weitere benutzung der $app['session.irgendwas'] durch weitere typehints geschützt ist, überall. das was du hier verlinkt hat, ist ledeglich eine art "setup" quasi vorbereitung für die eigentliche logik.

            ja du kannst keys einfach so überschreiben, aber du kriegst dann, bei falschen typen eine entsprechende exception.


            Mal andersrum gefragt, angenommen, du möchtest bei deinem vorhandenen Code nicht mehr native sessions nutzen, stattdessen speicherst du den inhalt in eine MongoDB , wieso , spielt erstmal keine rolle. Ziel session objekt zu ersetzen ohne deine gesamte applikation anpassen zu müssen, wir würdest du sowas mit deinem favorisierten Framework umsetzen?
            apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

            Kommentar


            • #21
              Lieber Blackscorp,

              ich bin nicht Don Quijote und möchte es auch nicht werden

              Es gibt in jeder Diskussion immer einen Punkt, ab dem man sich nur noch wiederholen kann.

              Ich habe versucht auf eine meiner Ansicht nach schwerwiegende Designschwäche im ServiceProvider-Konzept von Silex hinzuweisen. Ich habe es so gut es mir möglich war beschrieben und zu begründen versucht. Alles was ich dazu zu sagen hatte, habe ich bereits geschrieben. Wenn es trotzdem nicht reicht, dann kann ich daran leider nichts mehr ändern, sorry.

              vg
              jack
              -

              Kommentar


              • #22
                und ich habe versucht dir zu erklären dass du es missverstanden hast
                apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                Kommentar


                • #23
                  Der Punkt bei dem man sich nurnoch wiederholen kann bei der von dir initiierten Diskussion ist übrigen in Post Nr. #1

                  Silex ist so gewollt wie es ist. Das ist ein Fakt. Deine Schwerwiegende Designschwäche resultiert aus einem Framework-Wunschkonzert, auch das ist ein Fakt.
                  [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
                    @troy

                    - Silex ist okay so wie es ist,...
                    - Frameworks sind Frameworks....�*
                    - Silex ist so gewollt wie es ist. Das ist ein Fakt.
                    - Deine Schwerwiegende Designschwäche resultiert aus einem Framework-Wunschkonzert, auch das ist ein Fakt.
                    ...
                    Ist das ein Mantra, oder sowas? Wie wäre es mit ein paar echten Argumenten, die Deine sogenannten "Fakten" untermauern?

                    vg
                    jack
                    -

                    Kommentar


                    • #25
                      Stell doch bitte mal deine Gedanken als Issue in das Repository von Silex und lass dich vom Entwickler aufklären was seine Design-Entscheidungen rechtfertigt. Gegen eine Wand zu reden macht mir in etwa soviel Spaß wie 6 Wochen chinesische PHP-Syntax-Fehler-Strings auswendig lernen.

                      Wenn er einlenkt und deine Anmerkungen in einer neuen Version von Silex umsetzt, lenke ich auch ein und nutze Silex nicht weiter, weil es dadurch zuviel an Flexibilität verloren hat.

                      Bis dahin, Dif-tor heh smusma.
                      [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


                      • #26
                        @jack

                        du hast aktuell nicht verstanden dass

                        PHP-Code:
                        $session = new Session(); 
                        ein equivalent zu

                        PHP-Code:
                        $session $app['session']; 
                        sein soll mit dem feinen unterschied dass die klassen durch den service provider zunächst gesammelt werden und an einer zentralen stelle ersetz werden können.

                        $app ist nicht global, ja es hat alle keys mit instanzen und anderen werten, aber da kann man genauso sagen dass der autoloader gegen grundlegenden prinzipien von OOP verstößt, weil ich ja jederzeit eine xbelibige instanz einer klasse aus dem nichts erstellen kann.

                        $app ist nur in einem bestimmten Scope verfügbar
                        apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                        Kommentar


                        • #27
                          Zitat von BlackScorp Beitrag anzeigen
                          PHP-Code:
                          $session = new Session(); 
                          ein equivalent zu

                          PHP-Code:
                          $session $app['session']; 
                          Ich denke, dass Ihm das klar ist. Er hat eher ein Problem mit:

                          PHP-Code:
                          $app['session'] = new Foo(); 
                          Und genau dafür müsste er sich noch eine Sicherung einbauen!

                          Kommentar


                          • #28
                            Zitat von jprangenberg Beitrag anzeigen
                            Ich denke, dass Ihm das klar ist. Er hat eher ein Problem mit:

                            PHP-Code:
                            $app['session'] = new Foo(); 
                            Und genau dafür müsste er sich noch eine Sicherung einbauen!
                            die ist eben in form von typehints vorhanden
                            apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                            Kommentar


                            • #29
                              die ist eben in form von typehints vorhanden
                              So ein Unsinn….

                              PHP-Code:
                              $app->register(new Silex\Provider\SessionServiceProvider());

                              var_dump($app['session']);

                              $app['session'] = 'blubb';

                              var_dump($app['session']); 
                              Output:

                              object(Symfony\Component\HttpFoundation\Session\Se ssion)[40]
                              protected 'storage' =>
                              …..

                              string 'blubb' (length=5)

                              vg
                              jack
                              -

                              Kommentar


                              • #30
                                Zitat von jack88 Beitrag anzeigen
                                So ein Unsinn….
                                ist es nicht

                                PHP-Code:
                                $app->register(new Silex\Provider\SessionServiceProvider());

                                var_dump($app['session']);

                                $app['session'] = 'blubb'
                                ab hier beim aufruf deiner seite kommt eine exception dass Session klasse erweitet wird, string wurde erhalten

                                https://github.com/symfony/HttpFound...quest.php#L764 hier ist der check, mit invalidem key, kannst du kein Request benutzen
                                apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                                Kommentar

                                Lädt...
                                X