2016-08-05 19 views
0

Mit Laravel 5.2, und mit einer Middleware, muss ich ein bestimmtes Teil aus dem URI der Anfrage entfernen, bevor es versandt wird. Genauer gesagt möchte ich in einer URL wie "http://somewebsite.com/en/company/about" den "/ en /" Teil davon entfernen.

Dies ist die Art, wie ich es tue:

... 

class LanguageMiddleware 
{ 
    public function handle($request, Closure $next) 
    { 

     //echo("ORIGINAL PATH: " . $request->path()); //notice this line 


     //duplicate the request 
     $dupRequest = $request->duplicate(); 

     //get the language part 
     $lang = $dupRequest->segment(1); 

     //set the lang in the session 
     $_SESSION['lang'] = $lang; 

     //now remove the language part from the URI 
     $newpath = str_replace($lang, '', $dupRequest->path()); 

     //set the new URI 
     $request->server->set('REQUEST_URI', $newpath); 


     echo("FINAL PATH: " . $request->path()); 
     echo("LANGUAGE: " . $lang); 


     $response = $next($request); 
     return $response; 

    }//end function 

}//end class 

Dieser Code funktioniert gut - wenn der Original-URI "en/company/about", ist die resultierende URI in der Tat "Unternehmen/about". Mein Problem ist folgendes: Beachten Sie, dass die Zeile, in der ich den ORIGINALPATH zurückgebe, kommentiert ist (Zeile 8). Dies geschieht absichtlich. Wenn ich diese Zeile auskommentiere, funktioniert der Code nicht. Wenn der ursprüngliche URI "en/company/about" ist, ist der resultierende URI immer noch "en/company/about".

Ich kann nur zwei Schlüsse daraus ziehen: Entweder Senden der Ausgabe vor der Manipulation der Anfrage ist irgendwie der Übeltäter (getestet - das ist nicht der Fall), oder Aufruf der Methode $ request-> path(), um den URI zu bekommen etwas damit zu tun haben. Obwohl ich in der Produktion bin, werde ich natürlich niemals den URI wiedergeben müssen, und obwohl dies nur für Debugging-Zwecke ist, muss ich immer noch wissen, warum dies geschieht. Ich möchte nur den URI der Anfrage erhalten. Was fehlt mir hier?

Nebenbei bemerkt: Der Code stammt aus der ersten Antwort auf diesen Beitrag: https://laracasts.com/discuss/channels/general-discussion/l5-whats-the-proper-way-to-create-new-request-in-middleware?page=1

Antwort

0

Ich glaube nicht, dass Zeile # 8 Ihre Ausgabe manipuliert.
Hier ist die path() Methode von laravel's code:

public function path() 
    { 
     $pattern = trim($this->getPathInfo(), '/'); 
     return $pattern == '' ? '/' : $pattern; 
    } 

Wie Sie es gerade die pathInfo extrahieren, ohne sich sehen sich die Anfrage zu bearbeiten.

+0

Ich weiß, deshalb erscheint mir das so peinlich. Wie kann es dann sein, dass der Code perfekt funktioniert, wenn diese Zeile kommentiert wird, aber nicht funktioniert, wenn dies nicht der Fall ist? – pazof

+0

Ich werde versuchen, das gleiche mit meinem Setup zu tun und werde Sie wissen lassen – jaysingkar