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

  • #31
    ab hier beim aufruf deiner seite kommt eine exception dass Session klasse erweitet wird, string wurde erhalten
    Sag mal wovon sprichst Du da eigentlich? Meinst Du das Silex Framework

    https://github.com/silexphp/Silex/tree/1.2

    in der aktuellen Version 1.2 oder beziehen sich Deine Aussagen auf was ganz anderes?

    vg
    jack

    Kommentar


    • #32
      schau doch was silex intern verwendet

      https://github.com/silexphp/Silex/bl...ation.php#L512

      Symfony\Component\HttpFoundation\Request

      die symonfy componente sind soweit es geht durch Typehints abgesichert, es bringt also nichts dann noch davor checks einzubauen und wenn man keys durch unsinn ueberschreibt, kriegt man halt demensprechend eine exception.

      Kommentar


      • #33
        Ein vollständiges Codebeispiel:

        // Wir schreiben uns unseren eigenen HelloServiceProvider
        PHP-Code:
        <?php
        namespace Test;

        use 
        Silex\Application;
        use 
        Silex\ServiceProviderInterface;

        class 
        HelloService implements ServiceProviderInterface {
            public function 
        register(Application $app)
            {
                
        $app['hello'] = function () use ($app) {
                    return 
        'Hello Jack!!!';
                };
            }

            public function 
        boot(Application $app)
            {
            }
        }
        Diesen HalloService registrieren wir in unserer App und überschreiben diesen anschließend mit "UNSINN" - mal schauen was dann passiert:

        PHP-Code:
        <?php
        $loader 
        = require_once __DIR__.'/../vendor/autoload.php';
        $loader->addPsr4('Test\\''../Test');

        $app = new Silex\Application();

        $app->register(new Test\HelloService());

        var_dump($app['hello']);

        // Überschreibe den key jetzt mit "unsinn"
        $app['hello'] = "UNSINN!!!!";

        var_dump($app['hello']);

        $app->get('/hello/', function () use ($app) {
            return 
        $app['hello']." - Weit und breit keine Exception!";
        });
        $app->run();
        Die Ausgabe des Scripts sieht dann wie folgt aus:

        Code:
        string 'Hello Jack!!!' (length=13)
        string 'UNSINN!!!!' (length=10)
        UNSINN!!!! - Weit und breit keine Exception!
        Ist das wirklich so schwer zu verstehen?

        vg
        jack

        (Achtung: In den Codebeispielen werden leider wieder die Backslashes entfernt!)

        Kommentar


        • #34
          Werden hier nicht Äpfel und Birnen verglichen? Wenn der Programmierer scheiße baut, baut der Programmierer scheiße. Das ist nicht vergleichbar mit Usereingaben die Validiert werden müssen. Ich kann auch einfach $pdo->query('DROP DATABASE xyz'); absenden und es dann auf das Framework schieben dass es scheiße ist.

          Kommentar


          • #35
            und nun ein codebeispiel der auch Sinn ergibt

            PHP-Code:
             <?php
            namespace Test;

            use 
            SilexApplication;
            use 
            SilexServiceProviderInterface;
            use 
            Symfony\Component\HttpFoundation\Request;

            class 
            HelloService implements ServiceProviderInterface {
                public function 
            register(Application $app)
                {
                    
            $app['session'] = function () use ($app) {
                        return 
            'Hello Jack!!!';
                    };
                   
            $app->get('/',function(Request $request) {
                   
            $request->getSession()->set('foo','bar');
            echo 
            $request->getSession()->get('foo');
                 });
                }

                public function 
            boot(Application $app)
                {
                }
            }
            PHP-Code:
            require_once __DIR__.'/../vendor/autoload.php';
            $app = new SilexApplication();
            $app['debug'] = true;
            $app->register(new Silex\Provider\SessionServiceProvider());
            $app->register(new TestHelloService());
            $app->run(); 
            wenn du helloservice provider nach oben schiebst, wird der script laufen, da der session service provider $app['session'] ueberschreibt

            EDIT: weist du was Typehints sind?

            PHP-Code:
            class Foo{
            public function 
            __construct(PDO $pdo){}
            }

            $foo = new Foo(); //Exception , PDO erwartet 

            Kommentar


            • #36
              @tkausl
              Werden hier nicht Äpfel und Birnen verglichen? Wenn der Programmierer scheiße baut...
              Programmierer sind Menschen und Menschen machen Fehler. Programmierer werden leider immer Scheiße bauen. Damit Sie weniger Scheiße bauen gibt es eine ganze Reihe von Konzepten, Richtlinien, Tools usw. Eines davon sind gewisse Regeln/Konzepte für besseres Software-Design, die sich im Laufe der EDV-Geschichte aus Programmiererfahrungen von unzähligen Entwicklern als sinnvoll und empfehlenswert herauskristallisiert haben.

              ServiceProvider sind in Silex als wiederverwendbare Komponenten konzipiert. Es gibt auch ServiceProvider von Drittanbietern. Jeder ServiceProvider kann Dir im besten Falle die Komplette Applikation sofort zerschießen. Im schlimmsten Falle überschreibt er „nur“ (versehentlich oder auch nicht) irgendeinen Parameter von irgendeinem anderen Service.

              Kannst Dir sicher vorstellen wie schwer es ist solche Bugs in einer größeren Anwendung zu finden.

              Solche Fehler müssen heute nicht mehr passieren. Solche Fehler können von vornherein durch ein vernünftiges Design verhindert werden. Deshalb ist das Konzept von Silex in der akt. Implementierung schlecht.

              vg
              jack

              Kommentar


              • #37
                Zitat von jack88 Beitrag anzeigen
                Kannst Dir sicher vorstellen wie schwer es ist solche Bugs in einer größeren Anwendung zu finden.
                nein ist es nicht, mit genuegend typehints und interfaces kriegste immer eine fehlermeldung, es ist eher seltener dass da ein key versehntlich ueberschrieben wird

                auserdem testet man ja in der regel seine gesamte applikation vor dem deployment.

                wenn man keine tests, keine interfaces, kein typehinting hat, dann kann man nicht sagen dass ein framework scheise konzipiert ist

                (bloede umlaute arbeite mit englischen tastaturlayout)

                Kommentar


                • #38
                  @BlackScorp
                  und nun ein codebeispiel der auch Sinn ergibt?
                  - Habe ich in meinem Codebeispiel einen Service registriert und anschließend überschrieben?
                  - hast Du da irgendwo eine Exception gesehen?

                  Siehst Du Dich in der Lage diese zwei Fragen eindeutig kurz und knapp zu beantworten?

                  vg
                  jack

                  Kommentar


                  • #39
                    Das ist schon keine Wand mehr, das ist ne Stadtmauer.

                    Kommentar


                    • #40
                      Zitat von jack88 Beitrag anzeigen
                      @BlackScorp
                      - Habe ich in meinem Codebeispiel einen Service registriert und anschließend überschrieben?
                      nein haste nicht, desswegen war dein beispiel sinnlos, weil du dich ja beschwest dass man es ganz einfach machen kann im service provider und es wird nirgends geprueft und man kann ja dadurch eine gesamte applikation zerschiesen
                      Zitat von jack88 Beitrag anzeigen
                      - hast Du da irgendwo eine Exception gesehen?
                      und wieder ignorierste meine aussage, die exceptions kommen bei der weiterverwendung des objektes. und das ist eben der sinn.

                      Kommentar


                      • #41
                        BlackScorp, du versuchst gerade der Banane zu erklären das sie vor dem Affen weglaufen soll.

                        Kommentar


                        • #42
                          Zitat von tr0y Beitrag anzeigen
                          BlackScorp, du versuchst gerade der Banane zu erklären das sie vor dem Affen weglaufen soll.
                          nah sei doch nicht so, er wird es noch verstehen, ich habe auch frueher gedacht dass silex $app ein erstatz fuer $_GLOBALS ist und dass Laravel voller Statischen klassen ist, mittlerweile sehe ich die unterschiede

                          Kommentar


                          • #43
                            Ja, du versuchst auch Frameworks nicht als SDKs zu verkaufen, er schon.

                            Kommentar


                            • #44

                              Kommentar


                              • #45
                                @BlackScorp
                                Nur damit Du mir nicht wieder vorwirfst, Daß ich Deine Beiträge ignoriere:

                                wenn du helloservice provider nach oben schiebst, wird der script laufen, da der session service provider $app['session'] ueberschreibt
                                also schieben wir HalloService nach oben, so wie Du es sagst:

                                PHP-Code:
                                $app->register(new TestHelloService());
                                $app->register(new SilexProviderSessionServiceProvider()); 
                                wir registrieren also ZWEI Services in der App - ist doch so oder?

                                ZWEI, also:

                                1) $app->register(new TestHelloService())

                                und

                                2) $app->register(new SilexProviderSessionServiceProvider());

                                Sorry, das sind ja jetzt wirklich nicht meine Worte, aber sagst Du hier nicht zufällig gerade

                                wird der script laufen, da der session service provider $app['session'] ueberschreibt
                                Du sagst doch nicht etwa, daß der eine Service den anderen überschreibt und das Script trotzdem weiter läuft? Das würde ja heißen, wir haben zwei Services registriert, aber geblieben ist uns nur einer! Sozusagen aus zwei wird eins - und sehe da alles läuft brav weiter?! Magie!

                                Dann sind wir uns ja endlich einig, denn genau dieses Verhalten habe ich in meinem allerersten Posting auch beschrieben:

                                Es ist von überall und jederzeit problemlos möglich nicht nur die Services zu ändern oder komplett zu überschreiben,..

                                Ich hoffe ich habe das jetzt endlich geschnallt, es ist genau so wie ich es bereits gesagt habe und wie Du es mir erklären wolltest.

                                vg
                                jack

                                Kommentar

                                Lädt...
                                X