2016-07-31 22 views
3

Ich versuche, Sie verwenden die FastRoute Routing-Bibliothek und kann nicht das einfache Anwendungsbeispiel zu arbeiten! Ich frage mich, ob ich durch diesen Punkt zurückgeblieben bin, weil es ziemlich einfach sein sollte.Wie benutze ich FastRoute?

<?php 

require '/path/to/vendor/autoload.php'; 

$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) { 
    $r->addRoute('GET', '/users', 'get_all_users_handler'); 
    // {id} must be a number (\d+) 
    $r->addRoute('GET', '/user/{id:\d+}', 'get_user_handler'); 
    // The /{title} suffix is optional 
    $r->addRoute('GET', '/articles/{id:\d+}[/{title}]', 'get_article_handler'); 
}); 

// Fetch method and URI from somewhere 
$httpMethod = $_SERVER['REQUEST_METHOD']; 
$uri = $_SERVER['REQUEST_URI']; 

// Strip query string (?foo=bar) and decode URI 
if (false !== $pos = strpos($uri, '?')) { 
    $uri = substr($uri, 0, $pos); 
} 
$uri = rawurldecode($uri); 

$routeInfo = $dispatcher->dispatch($httpMethod, $uri); 
switch ($routeInfo[0]) { 
    case FastRoute\Dispatcher::NOT_FOUND: 
     // ... 404 Not Found 
     break; 
    case FastRoute\Dispatcher::METHOD_NOT_ALLOWED: 
     $allowedMethods = $routeInfo[1]; 
     // ... 405 Method Not Allowed 
     break; 
    case FastRoute\Dispatcher::FOUND: 
     $handler = $routeInfo[1]; 
     $vars = $routeInfo[2]; 
     // ... call $handler with $vars 
     break; 
} 

Wo der Kommentar liest „... Anruf $ Handler mit $ vars“, ich habe versucht, Rückkehr call_user_func_array($handler, $vars) aber es funktioniert nicht:

Hier wird die grundlegende Verwendung Beispiel auf der Github page gefunden ist .

Ich dachte auch, dass es vielleicht die .htaccess war Datei, die es funktioniert zu stoppen, da die Github Seite nicht für das Projekt .htaccess Datei Beispiel hat. Ich verwende diese:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . index.php [QSA,L] 

Ich habe auch versucht, eine Route mit einem Verschluss als Handler aufrufen, etwa so:

$r->addRoute('GET', '/', function() { 
    echo 'home'; 
}); 

Aber nichts! Ich bekomme jetzt ziemlich frustriert ...

+0

werfen Sie zuerst einen Blick auf diese Dokumentation: http://nikic.github.io/2014/02/18/Fast-request-routing-using-regular-expressions.html –

+0

@Sunitrams 'Ich habe schon aber kann' Damit das funktioniert, gibt es in diesem Post sowieso kein Verwendungsbeispiel. Danke trotzdem :) –

Antwort

10

Beispiel, wie Anfrage

$r->addRoute('GET', '/users', 'User/getUsers'); 

dann behandeln, wenn Dispatcher gefunden haben, können Sie es wie verarbeiten folgende

case FastRoute\Dispatcher::FOUND: 
    $handler = $routeInfo[1]; 
    $vars = $routeInfo[2];   
    list($class, $method) = explode("/", $handler, 2); 
    call_user_func_array(array(new $class, $method), $vars); 

    break; 

Vergessen Sie nicht zu schaffen Klasse User mit getUsers() Methode.

0
$r->addRoute(['GET','POST','PUT'], '/test', 'TestClass/testMethod'); 

Dann in Ihrer Versandmethode:

$routeInfo = $router->dispatch($httpMethod, $uri) 
switch($routeInfo[0]) { 
case FastRoute\Dispatcher::FOUND: 
$handler = $routeInfo[1]; 
$vars = $routeInfor[2]; 
list($class, $method) = explode('/',$handler,2); 
$controller = $container->build()->get($class); 
$controller->{$method}(...array_values($vars)); 
break; 
} 

Klasse und Verfahren natürlich von call_user_func() aufgerufen werden könnten, aber als ich der Router zu abstraktem und platziert draußen im Stammverzeichnis gesucht Ich entschied mich für einen DI-Container, der hervorragend ist.