2017-12-05 3 views
0

Ich habe eine Frage wie diese schon einmal gestellt, aber da ich immer noch keine Antwort darauf finden kann, werde ich es nochmal fragen: -s.URL mit 2 oder mehr Parametern neu schreiben

Ich verwende diese sehr rudimentär ‚Templat‘ Skript:

require_once 'core/init.php'; 

if(empty($_GET['page'])){ 
    header('Location: home'); 
    die(); 
} 

$basePath = dirname(__FILE__) . '/'; 
$viewPath = $basePath . 'view/'; 

$view = scandir($viewPath); 

foreach($view as $file)  
{ 
    if (!is_dir($viewPath . $file)) 
    { 
     $pages[] = substr($file, 0, strpos($file, '.')); 

    } 
} 

if(in_array($_GET['page'], $pages)){ 
    include($viewPath . $_GET['page'] . '.php'); 
} else{ 
    include($basePath . '404.php'); 
} 

und ich bin Umschreiben meiner url /base/index.php?page=somepage-/base/somepage (somepage ist eine .php Datei in meinem Vorlagenordner) mit dieser .htaccess Datei

RewriteEngine On 

RewriteBase /base/ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^?]*) index.php?page=$1 [L,QSA] 

mit 1 Parameter funktioniert es ganz gut, aber mein Problem ist, dass ich weiß nicht, wie eine zweite param zu umschreiben /base/profile?user=username (ohne .htaccess-Datei so aussehen wie diese /base/index.php?page=profile?user=username hätte) ein nd ich will es so aussehen /base/profile/username.

Ich hoffe, dass diese Frage verständlich ist: es

+0

Nur ... hast du diesen [Beitrag] sehen (https://stackoverflow.com/a/27169174/6780663) ? –

+0

hey @ AlejandroMontilla, ja ich habe das gesehen, aber da ich Laravel nicht benutze, konnte ich es nicht herausfinden :( – emma

+0

Du solltest die Antwort von @Zyigh sehen, es ist eine wirklich gute Erklärung. –

Antwort

1

Routing ein echtes Problem ist, und ich kann in einem Kommentar nicht erschöpfend sein, aber ich werde versuchen, mein Bestes zu tun. Bitte vergib mir mein ungefähres Englisch und lass es mich wissen, wenn du es nicht verstehst. Ich muss noch viel lernen, also werde ich versuchen, es durch etwas zu erklären, das ich gemacht habe, aber es ist wahrscheinlich vollkommen verbesserungsfähig.

Heutige PHP-Standard-Empfehlung über Routing und Dolmetschen Anfrage sollte implementieren PSR7.

Ich persönlich benutze es durch eine FrontController Design Pattern in einem MVC-Framework Ich baue diese Konzepte zu verstehen. Meine Ordner sind wie folgt organisiert:

  • öffentlich:
    Wo ich meinen Web-Server zu starten, in dem Sie Javascript/CSS finden. Es gibt eine index.php, die nur enthält

    require_once ('../ index.php');

  • App: Wo es der Router ist und meist alle generischen Code

  • Src: Wo es an die App die spezifischen Code. Das bedeutet Controller und Entitäten für jetzt.

  • Hersteller: Composer Abhängigkeiten wie GuzzleHTTP, um eine Klasse zwischen der tatsächlichen Anfrage und dem Code zu haben.

Hier ist der Code in index.php mein root:

<?php 
require_once 'vendor/autoload.php'; 

use Namespace\FrontController; 
use \GuzzleHttp\Psr7\ServerRequest; 
use function Http\Response\send; 

$front_ctrl = new FrontController(ServerRequest::fromGlobals()); 
send($front_ctrl->getResponse()); 

Der wichtigste Punkt ist, dass ich die Anfrage innerhalb einer Instanz einer Klasse Umsetzung PSR7 interpretieren.

In meinem FrontController, meine Anfrage Reisen durch einige Methoden (wie Entfernen von abschließenden Schrägstrich), um nur gesendet in einer Router-Klasse behandelt werden.

Die purpouse meiner Router-Klasse ist zu prüfen, ob die URI im Array existiert, wo ich meine Routen alle in einer JSON-Datei unter diesem Format bestücken:

{ 
    "/": [ 
     "AppController", 
     "indexAction", 
     ["GET", "POST"] 
    ],... 
} 

Dies ist, wo ich Regex verwenden Variable Übereinstimmen in der URI (/ article /: id zum Beispiel) auch.
Diese Klasse kann wie folgt fortgesetzt werden: "Existiert diese URI in meiner App?".

An dieser Stelle instanziiere ich eine neue Route-Klasse mit dem gesamten Array als Parameter. Von hier aus muss ich Fragen beantworten wie "Ist es an eine Methode in einem Controller angeschlossen?", "Wird die Methode, in der es gefragt wird, behandelt?" ...

Zusammenfassend, an dieser Stelle habe ich eine Instanz einer Klasse, die die Anfrage darstellt, eine andere, die alle meine Routen darstellt. Ich konfrontiere sie, um ONE Route zu bekommen, die ich durch eine Instanz einer Klassenroute manipulieren werde.

Wenn es all diese Tests bestanden hat, dann kann ich den richtigen Controller instanziieren, wo es den spezifischen Teil der App gibt, der eine Aktion erfordert, um Daten zu erhalten, die ich in meinen Ansichten senden werde, um eine HTML-Ausgabe zu erzeugen die ich zurück zu meiner Funktion zurücksenden werde, so dass die Ausgabe angezeigt wird, wenn Sie nach einem bestimmten URI fragen.

Der Hauptpunkt dieser langen Antwort ist, Ihnen etwas zu zeigen, das fast vollständig unabhängig vom Server ist. Es ist auch nützlich, wenn Ihre App größer wird und spezifischere Regeln für das Routing berücksichtigt. Es zwingt Sie, alle Bündel Ihrer App zu trennen: Ein Controller ist kein Modell, kein Router ...

Versuchen Sie, einige gute Tutorials zu finden, um orientierte Objektorientierung in PHP zu lernen, die einfache Sicherheitsprobleme vermeiden und geben würde Sie viel mehr Komfort, wenn eine App developping :)

Hoffe, dass es verständlich und hilfreich war die Überprüfung