Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] PDO singleton

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #31
    Du hällst deine Konfiguration in deinem Singleton nicht zentral, du hardcodest sie, was mit verlaub das dümmste ist was man mit Konfigurationen die Environment-abhängig sind anstellen kann.

    Statische Facades sind ein Beispiel wie man "global" auf ein und die selbe Instanz zugreifen kann ohne Singletons zu benutzen. Statische Facades sind entweder an Container-Einträge oder ganze Container geknüpft oder im Zweifelsfall nur an eine Instanz eines bestimmten Objekts ( ohne einen Container ).
    [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


    • #32
      Und wieso hälts du dann die Instanziierung auch nicht zentral?

      Kommentar


      • #33
        Tue ich doch, der Container existiert nur einmal in der ganzen Anwendung. Die Instanz also auch. Der Container wird im Bootstrap der Anwendung befüllt. Nach dem selben Muster funktioniert übrigens auch Silex ( Pimple ).
        [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


        • #34
          Ja, aber du rufst doch
          PHP-Code:
          $container = new ArrayObject();
          $container['database'] = new PDO(/** ... */); 
          jedes Mal neu auf. Das meinte ich.

          Kommentar


          • #35
            Das hat er doch gesagt, das wird genau einmal aufgerufen: Im Bootstrap. Warum sollte er das jedes Mal neu ausführen?
            [URL="http://goo.gl/6Biyf"]Lerne Grundlagen[/URL] | [URL="http://sscce.org/"]Schreibe gute Beispiele[/URL] | [URL="http://goo.gl/f2jR7"]PDO > mysqli > mysql[/URL] | [URL="http://goo.gl/jvfSZ"]Versuch nicht, das Rad neu zu erfinden[/URL] | [URL="http://goo.gl/T2PU5"]Warum $foo[bar] böse ist[/URL] | [URL="http://goo.gl/rrfzO"]SQL Injections[/URL] | [URL="http://goo.gl/Q81WJ"]Hashes sind keine Verschlüsselungen![/URL] | [URL="http://goo.gl/2x0e2"]Dein E-Mail Regex ist falsch[/URL]

            Kommentar


            • #36
              http://stackoverflow.com/questions/6...container-good
              Troy, was meinst du?

              Kommentar


              • #37
                Hallöchen,

                Zitat von coolio Beitrag anzeigen
                -Nur eine Instanz
                Und für einen Vorteil, den du vermeintlich geschickt gelöst haben willst, kleisterst du dir deinen Code mit statischen Abhängigkeiten voll? Pack die Instanz in einen DIC (Dependency Injection Container) und injiziere selbige in alle Klassen, welche sie benötigen. So kannst du von außen jederzeit beeinflussen, welche Objekt-Instanz verwendet werden soll, ohne Änderungen an der Klasse selbst vornehmen zu müssen. Das nenne ich einen Vorteil.

                Nicht so optimal:
                PHP-Code:
                class UserStorage{
                    public function 
                findUserById($id){
                        
                Database::getInstance()->prepare(..);
                        
                // ..
                    
                }

                Way to go:
                PHP-Code:
                // Konfiguration
                $dic['pdo'] = new PDO(..);

                ..

                // Schnittstellen-Definition
                interface IUserStorage{
                    function 
                findById($id);
                }

                ..

                // Implementierung
                class PDOUserStorage implements IUserStorage{
                    protected 
                $pdo null;

                    public function 
                __construct(PDO $pdo){
                        
                $this->pdo $pdo;
                    }

                    public function 
                findById($id){
                        
                $this->pdo->prepare(..);
                        
                // ..
                    
                }

                --

                Ich empfehle dir mal folgenden Artikel von Martin Fowler:

                - Inversion of Control Containers and the Dependency Injection pattern

                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


                • #38
                  Ich meine ich habe ein Beispiel gegeben für dessen Implementierung du eigenverantwortlich bist. Ich habe keinen Service Resolver implementiert, sondern nur umrissen wie Static Facades funktionieren.

                  Wenn du da mehr rein interpretieren willst, bitte schön. Es heißt übrigens tr0y, nicht troy. Dein o ist eigentlich eine 0.
                  [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


                  • #39
                    Ok, vielen Dank. Habs schlussendlich so gelöst, dass ich den Code von troy in modifizierter Weise ausgelagert habe und nun in meiner Anwendung einbinde und z.B. mittels
                    [PHP]Database::Prepare()[PHP]
                    aufrufe.

                    Kommentar


                    • #40
                      Aus eigenem Interesse zeig uns lieber den Code, damit wir dir sagen können ob das halbwegs Hand und Fuß hat was du daraus gemacht hast.
                      [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


                      • #41
                        Datei container.php
                        PHP-Code:
                        <?php
                        class Database{

                            private static 
                        $container;

                            public static function 
                        __callStatic($method, array $arguments){
                                if(!
                        self::$container instanceof ArrayObject){
                                    throw new 
                        RuntimeException('Static Facade is not connected to a container');
                                }

                                if(!
                        self::$container->offsetExists('database')){
                                    throw new 
                        RuntimeException('Connected container has not Database Object');
                                }

                                if (!
                        self::$container->offsetGet('database') instanceof PDO){
                                    throw new 
                        RuntimeException('Connected container serves a incompatible database object');
                                }

                                return 
                        call_user_func_array(
                                    array(
                                        
                        self::$container->offsetGet('database'),
                                        
                        $method
                                    
                        ),
                                    
                        $arguments
                                
                        );
                            }

                            public static function 
                        connectContainer(ArrayObject $container){
                                
                        self::$container $container;
                            }

                        }

                        $container = new ArrayObject();
                        $container['database'] = new PDO('mysql:host=localhost;dbname=test''root''');

                        Database::connectContainer($container);
                        Und in gaestebuch.php z.B.

                        PHP-Code:
                        <?php

                        include('container.php');

                        //code, code, code

                        $val Database::prepare('SELECT * FROM beitrage WHERE id = ?);
                        $val->bindParam(/**/);
                        //code, code, code

                        Kommentar


                        • #42
                          Zitat von coolio Beitrag anzeigen
                          Und das [static facade] bringt mir? (ausser minimale Codereduktion)
                          Ich finde das viel schöner! Bei Symfony ging mir das immer auf die Nerven, mir stets die Instanzen von allem erst mal holen zu müssen. DRY ist das nicht!

                          Kommentar


                          • #43
                            Okay, dann noch was damit du dich nicht vertippst beim array key:

                            PHP-Code:
                            <?php
                            class Database{

                                const 
                            CONTAINER_FIELD 'database';

                                private static 
                            $container;

                                public static function 
                            __callStatic($method, array $arguments){
                                    if(!
                            self::$container instanceof ArrayObject){
                                        throw new 
                            RuntimeException('Static Facade is not connected to a container');
                                    }

                                    if(!
                            self::$container->offsetExists(self::CONTAINER_FIELD)){
                                        throw new 
                            RuntimeException('Connected container has not Database Object');
                                    }

                                    if (!
                            self::$container->offsetGet(self::CONTAINER_FIELD) instanceof PDO){
                                        throw new 
                            RuntimeException('Connected container serves a incompatible database object');
                                    }

                                    return 
                            call_user_func_array(
                                        array(
                                            
                            self::$container->offsetGet(self::CONTAINER_FIELD),
                                            
                            $method
                                        
                            ),
                                        
                            $arguments
                                    
                            );
                                }

                                public static function 
                            connectContainer(ArrayObject $container){
                                    
                            self::$container $container;
                                }

                            }

                            $container = new ArrayObject();
                            $container[Database::CONTAINER_FIELD] = new PDO('mysql:host=localhost;dbname=test''root''');

                            Database::connectContainer($container);
                            [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


                            • #44
                              Danke dir, mein Freund. Bald dürfte deine Wunschliste auf Amazon kleiner werden

                              Kommentar


                              • #45
                                Zitat von coolio Beitrag anzeigen
                                Danke dir, mein Freund. Bald dürfte deine Wunschliste auf Amazon kleiner werden
                                Da freut sich tr0y.
                                [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