2012-04-09 7 views
2

Ich war auf der Symfony-Website. Ich hatte nicht wirklich das Gefühl, dass ich die Funktionalität des Frameworks brauche, aber ich mochte den Routing-Teil. Es ermöglicht Ihnen, URL-Muster wie diesesEinfachste Möglichkeit, Route in PHP zu mappen

/some/path/{info} 

Jetzt für URL angeben, wie www.somewebsite.com/app.php/some/path/ANYTHING es erlauben würden Sie Client eine Antwort spezifisch für diese URL zu senden. Sie könnten auch die Zeichenfolge ANYTHING verwenden und sie ähnlich wie GET-Parameter verwenden. Es gibt auch eine Option, um app.php Teil der URL zu verstecken, die uns URL wie www.somewebsite.com/some/path/ANYTHING verlässt. Meine Frage ist, was ist der beste Ansatz, dies ohne ein komplexes Framework zu tun?

+4

Sprechen Sie über [URL Neuschreiben] (http://en.wikipedia.org/wiki/URL_rewriting)? –

+0

Ja, ich wusste nicht, das ist der Name dafür –

+0

Ich habe wieder auf den ursprünglichen Wortlaut zurückgegriffen. Denken Sie an Benutzer, die mit dem Konzept nicht vertraut sind und die gleiche Formulierung wie er suchen. Behalten Sie den aktuellen Wortlaut bei und erklären Sie, was das Umschreiben von URLs ist. –

Antwort

2

Das Problem ist, dass ein Routing eine komplexe Sache in einem Framework ist.

Vielleicht werfen Sie einen Blick auf Silex. Es ist ein Mikro-Framework basierend auf den Symfony2-Komponenten. Es ist nicht so groß wie Symfony2, hat aber einige Funktionen.

7

Ich habe mein eigenes Mini-Framework mit der gleichen Routing-Syntax gemacht. Hier ist, was ich tue:

  1. Verwenden mod_rewrite die Parameter zu speichern (wie /some/path/{info}) in einer $_GET Variable Ich nenne params:

    RewriteRule ^(.+)(\?.+)?$ index.php?params=$1 [L,QSA]

  2. die Parameter analysieren und speichern sie global mit dieser Funktion :

    public static function parseAndGetParams() {

    }

  3. Weg zur richtigen Seite dynamisch:

    // get the base page string, must be done after params are parsed 
    public static function getCurPage() { 
        global $params; 
    
        // default is home 
        if(empty($params)) 
        return self::PAGE_HOME; 
        // see if it is an ajax request 
        else if($params[0] == self::PAGE_AJAX) 
        return self::PAGE_AJAX; 
        // see if it is a multi param page, and if not, return error 
        else { 
         // store this, as we are going to use it in the loop condition 
         $numParams = count($params); 
    
         // initialize to full params array 
         $testParams = $params; 
         // $i = number of params to include in the current page name being checked, {1, .., n} 
         for($i = $numParams; $i > 0; $i--) { 
          // get test page name 
          $page = strtolower(implode('/', $testParams)); 
    
          // if the page exists, return it 
          if(self::pageExists($page)) 
           return $page; 
    
          // pop the last param off 
          array_pop($testParams); 
         } 
    
         // page DNE go to error page 
         return self::PAGE_ERROR; 
        } 
    } 
    

Der Wert hier ist, dass es für die Seite spezifischsten Seite der dest bestimmten sieht . Außerdem gibt es außerhalb des Frameworks vollständige Kontrolle also, wenn es irgendwo einen Fehler gibt, wissen Sie, dass Sie es beheben können - Sie müssen nicht einige seltsame Problemumgehung in Ihrem Framework nachschlagen.

Nun, da $params global ist, ruft jede Seite, die einen Parameter verwendet, einfach $params[X] auf, um damit zu arbeiten. Freundliche URLs ohne Rahmen.

Die Art und Weise, wie ich Seiten hinzufüge, stelle ich dann in ein Array, das im pageExists($page) Aufruf betrachtet wird.

Für AJAX nennt, habe ich in einem speziellen IF:

// if ajax, include it and finish 
if($page == PageHelper::PAGE_AJAX) { 
    PageHelper::includeAjaxPage(); 
    $db->disconnect(); 
    exit; 
} 

Und voilà - Ihr eigenes Mikro-Routing-Rahmen.

Verwandte Themen