2016-08-01 5 views
0

Immer, wenn ich versuche und eine Route zu behandeln, die wie controller/foo.xtn aussieht, klagt Yii Unable to determine the path info of the current request.. Ich möchte diese Routen handhaben, indem ich xtn in einen Aktionsparameter umwandle, d.h. actionFoo($xtn), aber auch controller/foo?type=xtn. Mein Plan ist es, eine UrlRule zu schreiben, um dieses Verhalten zu definieren, aber wie kann ich den Fehler bei der Pfadanalyse umgehen?Ermöglicht das Parsen von dateiähnlichen URL-Routen

Ich benutze enablePrettyUrl, und möchte enableStrictParsing aber jetzt kann ich ohne es umgehen.

Edit: Was funktioniert und was nicht -

controller/foo/abc?type=xtn ---> actionFoo('abc', 'xtn') # works 
controller/foo/abc/xtn ---> actionFoo('abc', 'xtn') # works 
controller/foo/abc.xtn ---> actionFoo('abc', 'xtn') # doesn't work 

Der Fehler von getPathInfo() geworfen wird beim Versuch, controller/foo/abc.xtn zu analysieren, so durch Yü vom Webserver weitergeleitet es wird.

Routing config (PHP internen Webserver für jetzt verwenden):

<?php 
// www/routing.php 
if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"])) { 
    return false; 
} else { 
    include __DIR__ . '/../web/index.php'; 
} 

die oben Config, kann ich die PHP-Server finden Sie in der REQUEST_URI Variable setzt, die, was Yü ist liest.

'REQUEST_URI' => '/controller/foo/abc.xtn?app=4' 

Also ich glaube nicht, dass dies ein Webserverproblem ist. Hier ist der einzige signifikante Unterschied in $ _SERVER-Arrays:

# fails in getPathInfo() 
'REQUEST_URI' => '/feeds/strings/en.json?app=4', 
'SCRIPT_NAME' => '/feeds/strings/en.json', 
'SCRIPT_FILENAME' => '/Users/darvids0n/NetBeansProjects/php-web-services/web/www/routing.php', 
'PHP_SELF' => '/feeds/strings/en.json', 

# works 
'REQUEST_URI' => '/feeds/strings/en?app=4', 
'SCRIPT_NAME' => '/index.php', 
'SCRIPT_FILENAME' => '/Users/darvids0n/NetBeansProjects/php-web-services/web/index.php', 
'PATH_INFO' => '/feeds/strings/en', 
'PHP_SELF' => '/index.php/feeds/strings/en', 

Wenn Sie lesen Yü die source code, aber Sie werden sehen, dass der Mangel an PATH_INFO nicht wirklich in das Scheitern Faktor zu ‚Pfadinformationen bestimmen‘.

Antwort

2

Der unbekannte Pfad sollte mit 404 enden. Der Versuch, ihn umzuleiten, könnte schwierig sein, Sie müssen aufpassen, nicht in die Schleife zu geraten.

Sie können letzte Regel in der Liste hinzufügen, die die „letztes Mittel“ Weg sein wird, so etwas wie

'<controller>/<action>' => '<controller>/<action>', 

Jeder Controller und die Aktion wird hier arbeiten.

Für Dateierweiterungen können Sie Suffixparameter für Ihre Regeln verwenden.

[ 
    'pattern' => 'posts', 
    'route' => 'post/index', 
    'suffix' => '.json', 
], 

Ich würde Stick mit einem Parameternamen, wenn Sie Erweiterung Aktion übergeben möchten:

'controller/foo/<type:\w+>' => 'controller/foo' 

So müssen Sie Maßnahmen wie:

public function actionFoo($type) 
+0

nicht sicher, ob ich bin Ihnen zu folgen, wie das hilft. Unabhängig von meinen URL-Regeln ist einer der ersten Schritte beim Routing der Anfrage der Aufruf von ['getPathInfo()'] (https://github.com/yiisoft/yii2/blob/master/framework/web/UrlManager.php# L237). Dies löst eine Ausnahme aus, bevor wir mit der Iteration der Regeln beginnen. – darvids0n

+0

Oh, in diesem Fall gibt es ein Problem mit Ihrer Serverkonfiguration. Ist es Apache? Könnten Sie Ihre Host-Einstellungen einfügen, wenn dies der Fall ist? – Bizley

+0

Pasted Routing Config und ein paar andere Dinge. – darvids0n

0
// controller (site) 
public function actionFoo($type) 
// rule 
'site/foo<type:(\.xtn)>' => 'site/foo', //site/foo.xtn 
'site/foo/<type:(\.xtn)>' => 'site/foo' //site/foo/xtn 
+0

Versucht dies bereits, gibt es den gleichen Pfad Info Fehler. – darvids0n

+0

Vor der Antwort, ich habe überprüft - es funktioniert, wahrscheinlich haben Sie einen Konflikt, setzen Sie diese Regel in der 1. Position. Yii Version: 2.0.9. Überprüfen Sie auch, ob der Webserver 'xtn' als' php' behandelt – cetver

+0

Gleiche Yii-Version. Ich benutze PHP internen Webserver, um dies zu testen, könnte ein Problem damit sein, außer dass ich einen Yii-Fehler im Browser sehe, so dass es immer noch alles durch 'index.php' auflöst. – darvids0n

Verwandte Themen