1

PHP では、klein ルーティングは可能な限り多くのルートに一致します。設定した 2 つのルートが競合しています。彼らです:

$route1: '/websites/[i:websiteId]/users/[i:id]?'

$route2: '/websites/[i:websiteId]/users/[a:filename].[json|csv:extension]?'

これは私が一致させようとしている URL であり、2 番目ではなく 1 番目と一致する必要があると思います:

/api/v1-test/websites/100/users/4

これら 2 つの正規表現は次のとおりです。

$regex1: `^/api(?:/(v1|v1-test))/websites(?:/(?P<websiteId>[0-9]++))/users(?:/(?P<id>[0-9]++))?$`

$regex2: `^/api(?:/(v1|v1-test))/websites(?:/(?P<websiteId>[0-9]++))/users(?:/(?P<filename>[0-9A-Za-z]++))(?:\.(?P<extension>json|csv))?$`

「.csv」または「.json」がない場合は一致しないという意味です。問題は、両方のルートが一致していることです。2 番目のファイル名は「4」で、拡張子は空白です。

/api/v1-test/websites/100/users/users.csv の送信は正しく機能し、2 番目のルートにのみ一致します。

正規表現やマッチングではなく、ルートのみを制御できます。ありがとう。

4

2 に答える 2

0

ここのビット

(?:\.(?P<extension>json|csv))?

2番目の正規表現の最後にあると、最後にあるため、ファイル名があるかどうかに関係なく一致します?。疑問符は を意味し0 or 1 of the previous expressionます。それを取り除くと、少なくとも、文字列は拡張子がある場合にのみこの正規表現に一致します。

この変更を行うには、次のように 2 番目のルートから疑問符を削除します。

$route2: '/websites/[i:websiteId]/users/[a:filename].[json|csv:extension]'
于 2013-04-13T00:22:29.737 に答える