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 番目のルートにのみ一致します。
正規表現やマッチングではなく、ルートのみを制御できます。ありがとう。