2016-12-16 16 views
5

route.phpで、2つのトークンを持つコントローラへのルートを定義しました。URLが間違ったコントローラにぶつかったLARAVEL

Route::get('/{category}/{slug}', '[email protected]'); 

すべてが同じ構造を持っていますが、以下に示すような経路によってキャッチする必要があるものとは何の関係もありませんURLへの呼び出しがあるときまで正常に動作しています。

例えば、"/admin/tags"がある場合、コントローラは同じ構造の"/{category}/{slug}"を持っているので、下のコントローラがトリガされます。もちろん、変数が見つからないため、エラーが表示されます。

これで、そのルートを下に移動する問題を修正しましたが、この動作を事前に防ぐために何かを行わなければならないと思います。混乱する。

このような場合、どうすればよいでしょうか?

P.S.私はララベルと超初心者です

+0

ワイルドカードルートのようなルートがある場合は、ルートの最下部に常に配置することをお勧めします。 – aceraven777

答えて

2

ルートにいくつかの制約、参照parameters-regular-expression-constraintsを使用しています。たとえば、

Route::get('user/{name}', function ($name) { 
    // 
}) 
->where('name', '[A-Za-z]+'); 

また、特定しないものよりも具体的にすることができます。たとえば、この順序で:

Route::get("/admin/tags", '......'); 
Route::get('/{category}/{slug}', '[email protected]'); 
1

ルートはそのような2つのトークンが必要な場合、私のルートは、この

Route::get('/categories/{category}/slug/{slug}', '[email protected]'); 

または

Route::get('/categories/{category}/{slug}', '[email protected]'); 
0

私のように見えるので、私は通常プレフィックスを追加しています同じ問題を抱えていた残念ながら、競合が次の間で起こる(あなたが常に必要として)と は、私はすべてのパスパラメータの制約を持っている:1つのパスがパスにプリペンド「リンクを/」があっても、それはまだしようとした

Route::get('{userId}/{path}', [ 
    'as' => 'products', 
    'uses' => '[email protected]' 
])->where(['id' => '[0-9]+', 'path' => '[0-9a-fA-F]+']); 

Route::get('link/{link_path}', [ 
    'as' => 'product-link', 
    'uses' => '[email protected]' 
])->where(['link_path' => '[0-9a-fA-F]+']); 

もう一方を打つ。リンク先の 'リンク/'を他のルートの上に置くことによって、優先順位が高くなり、機能します。

個人的に私はあなたがルートwhere節で満たされていない条件を持っているなら、ルートをスキップして次へ進んでいくべきだと思います。条件が満たされていない場合、実際には渡されない条件を入れることは、実際には意味がありません。

これは、この問題を抱えている人に役立ちます。

関連する問題