Ankündigung

Einklappen
Keine Ankündigung bisher.

index-Routing

Einklappen

Neue Werbung 2019

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

  • index-Routing

    Guten Abend werte Gemeinde,

    ich arbeite derzeit an einem Projekt mit einigen Freunden, ich kümmere mich dabei um die "Basisstruktur" des Projektes. Da wir nicht auf ein Framework zurück greifen wollen, versuche ich sowas selbst zu implementieren.

    Dabei orientiere ich mich geringfügig an Frameworks wie Symfony 2 und CodeIgniter.

    Da ich noch nicht so viel Erfahrung bezüglich index-Routing (alle Serveranfragen laufen an die index.php) habe würde ich Euch bitten mal kurz über meinen Code drüber zu sehen und mich über eventuelle Fehlerquellen und Verbesserungen zu informieren.

    Vielen Dank im voraus.


    index.php:

    PHP-Code:
    <?php

    // Bootstrap.php laden (MUSS an erster Stelle stehen)
    require_once 'bootstrap.php';

    // Befinden wir uns in einer Developer-Umgebung werden PHP-Fehler angezeigt,
    // andernfalls nicht.
    if(DEV)
    {
        
    ini_set("display_errors""1");
        
    error_reporting(E_ALL);
    }

    try
    {   
        
    // Angefragte Route auslesen
        
    $route $_SERVER['REQUEST_URI'];

        
    // Router-Objekt erzeugen und Applikation starten
        
    $app = new classes\\base\\Router($route);
        
    $app->start();
    }
    catch(
    Exception $ex)
    {
        
    // Befinden wir uns in einer Developer-Umgebung werden Exceptions angezeigt,
        // andernfalls in eine Datei gespeichert.
        
    if(DEV)
        {
            echo 
    '<br><br>Message: ' $ex->getMessage() . '<br>';
            echo 
    'File: ' $ex->getFile() . '<br>';
            echo 
    'Line: ' $ex->getLine();
        }
        else
        {
            
    $now = new DateTime();
            
            
    $data 'Fehler trat auf am ' $now->format('d.m.Y \u\m H:i:s') . ' Uhr';
            
    $data .= 'Message: ' $ex->getMessage() . PHP_EOL;
            
    $data .= 'File: ' $ex->getFile() . PHP_EOL;
            
    $data .= 'Line: ' $ex->getLine();
                    
            
    file_put_contents('Logfile.log'$dataFILE_APPEND);
        }
    }
    Router.php:

    PHP-Code:
    <?php

    namespace classes\\base;

    use 
    classes\\base\\Loader;

    /**
     * Description of Router
     *
     */
    class Router
    {
        private 
    $requestUri NULL;
        
        
    /**
         * 
         * @param string $requestUri Vom Nutzer angefragte URL
         */
        
    public function __construct($requestUri)
        {
            
    $this->requestUri $requestUri;
        }
        
        
    /**
         * Startet die Applikation, prüft ob die eingegebene URL gültig ist und
         * ruft ggf. den entsprechenden Controller und die hinterlegte Methode auf
         * 
         * Einzige Stelle im Code die ein "echo" nutzen darf.
         */
        
    public function start()
        {
            
    $routes $this->getRoutes();
            
            
    $found_route FALSE;
            foreach(
    $routes as $route)
            {
                if(
    $this->requestUri === $route->route)
                {
                    
    $found_route TRUE;
                    
                    require_once 
    'controller/' $route->controller '.php';
                    
                    
    $controller = new $route->controller();
                    echo 
    $controller->{$route->action}();
                }
            }
            
            if(!
    $found_route)
            {
                
    // Seite ist uns nicht bekannt. (eventuell hier eine 404-Error View)
                
    header("HTTP/1.1 404 Not Found");
                exit(
    "Die angeforderte Seite ist uns nicht bekannt");
            }
        }
        
        
    /**
         * 
         * @return object Gibt ein Objekt mit allen konfigurierten Routes zurück
         */
        
    private function getRoutes()
        {
            
    $loader = new Loader();
            
            return 
    $loader->loadConfig('routes');
        }
    }
    EDIT: Backslashes werden hier scheinbar nicht richtig angezeigt, ich bitte das zu ignorieren
    - Laravel

  • #2
    Das Routen-Mapping ist für meinen Geschmack zu statisch (es werden keine Wildcards/Parameter unterstützt) und es unterscheidet auch nicht zwischen HTTP-Verben (GET, POST, …). Dazu ist ein Router in dem Sinne keine Application.

    Schaut euch zum Beispiel mal Silex an. Auch in Hinblick darauf, wie dort mit Request- und Response-Klassen gearbeitet wird.

    Allgemein ist das hier ein Thread der Marke: „Ich will es selbst machen. Wie geht das?“ Das habe ich zuletzt hier angemerkt. (Hilft vielleicht bei der Einordnung, wie ich das meine.) Du/ihr entscheidet euch bewusst dafür, nicht auf fertige Komponenten zu setzen, habt dann aber keine eigenen Lösungen für Fragestellungen, die die fertigen Komponenten bereits beantwortet haben. Ich weiß, dass das nicht unbedingt das ist, was du dir als Antwort wünschst, aber ich finde euren Ansatz einfach nicht effizient/sinnvoll. Blendet nicht das aus, was bereits existiert. Das ist – und das ist bei mir leider auch oft nicht anders – immer so ein wenig die Unlust, sich in bestehende Software einzuarbeiten, glaube ich. Da sollten wir alle ehrlich zu uns selbst sein.

    Wenn man derlei Dinge selbst machen will, sollte man sie (a) tatsächlich selbst machen (nicht unbedingt unter allen Umständen klug) oder (b) solche Threads und Fragestellungen mit Bezug auf existierende Lösungen formulieren. Dein Hinweis auf Symfony 2 und CodeIgniter ist mir in der Beziehung hier zu wenig.

    (Das ist aber jetzt relativ subjektiv formuliert. Das soll kein rhetorischer Stopper für weitere Antworten sein. )

    Kommentar


    • #3
      Ich schließe mich da voll und ganz mermshaus an. Wie komplex so ein Router im Grunde wird kannst du dir auch hier ansehen: https://gist.github.com/Golpha/1db1443f7a3decd5f444
      [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


      • #4
        Zitat von mermshaus Beitrag anzeigen
        Das Routen-Mapping ist für meinen Geschmack zu statisch (es werden keine Wildcards/Parameter unterstützt) und es unterscheidet auch nicht zwischen HTTP-Verben (GET, POST, …). Dazu ist ein Router in dem Sinne keine Application.

        Schaut euch zum Beispiel mal Silex an. Auch in Hinblick darauf, wie dort mit Request- und Response-Klassen gearbeitet wird.

        Allgemein ist das hier ein Thread der Marke: „Ich will es selbst machen. Wie geht das?“ Das habe ich zuletzt hier angemerkt. (Hilft vielleicht bei der Einordnung, wie ich das meine.) Du/ihr entscheidet euch bewusst dafür, nicht auf fertige Komponenten zu setzen, habt dann aber keine eigenen Lösungen für Fragestellungen, die die fertigen Komponenten bereits beantwortet haben. Ich weiß, dass das nicht unbedingt das ist, was du dir als Antwort wünschst, aber ich finde euren Ansatz einfach nicht effizient/sinnvoll. Blendet nicht das aus, was bereits existiert. Das ist – und das ist bei mir leider auch oft nicht anders – immer so ein wenig die Unlust, sich in bestehende Software einzuarbeiten, glaube ich. Da sollten wir alle ehrlich zu uns selbst sein.

        Wenn man derlei Dinge selbst machen will, sollte man sie (a) tatsächlich selbst machen (nicht unbedingt unter allen Umständen klug) oder (b) solche Threads und Fragestellungen mit Bezug auf existierende Lösungen formulieren. Dein Hinweis auf Symfony 2 und CodeIgniter ist mir in der Beziehung hier zu wenig.

        (Das ist aber jetzt relativ subjektiv formuliert. Das soll kein rhetorischer Stopper für weitere Antworten sein. )
        Danke für deine ehrliche Meinung

        Zum Thema Symfony 2 und CodeIgniter: Symfony finde ich für unser Projekt persönlich einfach zu mächtig, da wir auf Performance achten möchten und nur die wenigsten Tools benötigen werden, sich in Symfony einzuarbeiten ist nicht das Problem, ich hab bereits damit gearbeitet und finde es auch ziemlich gut. CodeIgniter habe ich auch schon genutzt - leider engt uns das zu sehr ein, man kann nicht so "frei" arbeiten wie in Symfony.

        Ich werde mir auch mal Silex anschauen. Das wird mir bestimmt auch weiter helfen können.
        - Laravel

        Kommentar


        • #5
          Wobei man nicht vergessen sollte das du ja nicht alles von Symfony nutzen musst. Silex bspw. ist ein Micro-Framework das auf Symfony aufbaut ( aber nicht alles was Symfony als "created project" kann auch hat ).
          [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


          • #6
            da wir auf Performance achten
            also mal im Ernst, Symfony hat einen Riesen Cache (der ganze Container, die Annotations und das Routing u.a. werden gecached).
            Da hat man eher keine Performance Probleme.

            Des weiteren - tr0y hat es schon angesprochen - besteht Sf2 aus einer Menge Standalone Komponenten, die man auch ohne das ganze Framework nutzen kann
            https://github.com/Ma27
            Javascript Logic is funny:
            [] + [] => "", [] + {} => object, {} + [] => 0, {} + {} => NaN

            Kommentar


            • #7
              Zitat von Ma27 Beitrag anzeigen
              also mal im Ernst, Symfony hat einen Riesen Cache (der ganze Container, die Annotations und das Routing u.a. werden gecached).
              Da hat man eher keine Performance Probleme.

              Des weiteren - tr0y hat es schon angesprochen - besteht Sf2 aus einer Menge Standalone Komponenten, die man auch ohne das ganze Framework nutzen kann
              Kurze Frage dazu, weil ich mich mit Symfony noch nicht wirklich beschäftigt habe. Wie wird das gecached? Memcache?
              Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
              [URL]http://www.lit-web.de[/URL]

              Kommentar


              • #8
                Hi vielleicht,

                hilf dir mein Mini Framework weiter:

                https://github.com/Devintelligence/smallORM

                Kommentar


                • #9
                  Zitat von devintelligence Beitrag anzeigen
                  Hi vielleicht,

                  hilf dir mein Mini Framework weiter:

                  https://github.com/Devintelligence/smallORM
                  Is nicht böse gemeint, aber da ist er mit Silex deutlich flexibler und besser bedient.
                  Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                  [URL]http://www.lit-web.de[/URL]

                  Kommentar


                  • #10
                    Is nicht böse gemeint, aber da ist er mit Silex deutlich flexibler und besser bedient.
                    ++

                    Kurze Frage dazu, weil ich mich mit Symfony noch nicht wirklich beschäftigt habe. Wie wird das gecached? Memcache?
                    nope, es gibt ein Cache verzeichnis und da wird dann alles reingeschrieben:

                    Bei mir sieht das dann etwa so aus:
                    Code:
                    app/
                        cache/
                            dev/ # fuer einzelene Environments gibt es Cache verzeichnisse
                                annotations/ # Cache fuer die Annotations
                                assetic/ # generierte routing.yml file fuer assetic
                                doctrine/ # Doctrine proxy classes
                                jms_serializer/
                                profiler/ # compiliertes Zeug vom symfony profiler
                                twig/ # twig cache
                                appDevDebugProjectContainer.php # compilierter di container
                    Man kann auch noch CacheWarmer schreiben, die dann statische Sachen in den Cache schreiben:
                    https://github.com/symfony/Framework...acheWarmer.php
                    https://github.com/Ma27
                    Javascript Logic is funny:
                    [] + [] => "", [] + {} => object, {} + [] => 0, {} + {} => NaN

                    Kommentar


                    • #11
                      @litterauspirna: Symfony bietet ebenso apc-Cache an.

                      Kommentar


                      • #12
                        @litterauspirna: Symfony bietet ebenso apc-Cache an.
                        link bitte
                        https://github.com/Ma27
                        Javascript Logic is funny:
                        [] + [] => "", [] + {} => object, {} + [] => 0, {} + {} => NaN

                        Kommentar


                        • #13
                          Muss man in der app.php aktivieren:

                          https://github.com/symfony/symfony-s...eb/app.php#L13

                          Kommentar


                          • #14
                            naja den ApcClassLoader kenn ich.

                            hartCoder sprach nur von apc cache und ich habe davor den Symfony cache (der ge-dumpte DI Container usw.), wodurch ich das wohl missverstanden habe.

                            LG
                            https://github.com/Ma27
                            Javascript Logic is funny:
                            [] + [] => "", [] + {} => object, {} + [] => 0, {} + {} => NaN

                            Kommentar


                            • #15
                              Wenn es um Performance geht: Phalcon ist schnell, da in C implemtiert und bietet eigentlich alles, was man von einem Framework erwartet. Mit Techniken wie HHVM oder was auch immer in PHP7 passieren sollte kann sich das natürlich etwas relativieren.
                              Fatal Error: Windows wird gestartet

                              Wie administriert man ein Netzwerk: Beispiel

                              Kommentar

                              Lädt...
                              X