多个路由默认为Laravel中的控制器

时间:2014-09-09 19:22:55

标签: laravel laravel-4 laravel-routing

我希望能够通过短链接找到一篇文章,例如articles/ID,但我也希望通过完整链接articles/ID/category/slug到达那里。但我不能让以下工作:

// Route file:
Route::pattern('id', '[0-9]+');
Route::pattern('cat', '^(?!create).*');
Route::pattern('slug', '^(?!edit).*');
Route::get('articles/{id}/{cat?}/{slug?}', ['as' => 'articles.show', 'uses' => 'ArticlesController@show']);

// Controller file:
public function show($id, $cat = null, $slug = null)
{
    dd('1: ' . $cat . ' | 2:' . $slug);
}

以下链接articles/28/ullam/vel-repellendus-aut-est-est-esse-fugiat给出了结果:

string(53) "1: ullam/vel-repellendus-aut-est-est-esse-fugiat | 2:"

我不明白为什么它没有拆分,如果我删除路由定义中的?它就有效。

我已经尝试过这个解决方案https://stackoverflow.com/a/21865488/3903565并且可行,但不是针对控制器时。为什么呢?

更新;我最终重新安排了我的路线文件:

Route::pattern('id', '[0-9]+');

// Articles
Route::get('articles/create', ['as' => 'articles.create', 'uses' => 'ArticlesController@create']);
Route::get('articles/edit/{id}', ['as' => 'articles.edit', 'uses' => 'ArticlesController@edit']);
Route::get('articles/{id}/{category?}/{slug?}', ['as' => 'articles.show', 'uses' => 'ArticlesController@show']);
Route::get('articles/{category?}', ['as' => 'articles.index', 'uses' => 'ArticlesController@index']);
Route::resource('articles', 'ArticlesController', ['only' => ['store', 'update', 'destroy']]);

2 个答案:

答案 0 :(得分:2)

这是你唯一的路线吗?或者你有一个不同的指向也显示?我刚刚添加了这个作为我的第一条路线:

Route::get('articles/{id}/{cat?}/{slug?}', function($id, $cat, $slug)
{
    dd($id.': ' . $cat . ' | 2:' . $slug);
});

得到了这个结果:

28: ullam | 2:vel-repellendus-aut-est-est-esse-fugiat

更改路线的顺序,将第一条路线作为最具体的路线,将最后一条路线作为最通用的路线。此外,如果您有任何模式,他们可能会对您的结果进行干预。

看起来某些模式和可选参数(?)存在问题,所以如果你这样做了

Route::pattern('id', '[0-9]+');
Route::pattern('cat', '^(?!create).*');
Route::pattern('slug', '^(?!edit).*');

Route::get('articles/{id}/{cat}/{slug}', function($id, $cat, $slug)
{
    dd($id.': ' . $cat . ' | 2:' . $slug);
});

它会正常工作。我的建议是不要过多地重用路由,如果你有一个特定的路由,你为它创建一个路由命令,并在最通用的路由命令之前添加它:

Route::get('articles/{id}/create', function($id)
{
    dd('this is the create route');
});

Route::get('articles/{id}/{cat}/{slug}', function($id, $cat, $slug)
{
    dd($id.': ' . $cat . ' | 2:' . $slug);
});

与寻找正则表达式模式的复杂性相比,创建新路由的成本较低,并尝试在其中找到自己的方式。在项目上有新的合作者,甚至为了将来的自我,更简单,更好。

在Laravel 4.3中,您可以访问路由缓存,这使得路由几乎立即被触发。

答案 1 :(得分:1)

问题仅在于前瞻模式。

您需要$和不包括/的课程才能使其发挥作用。

所以他们在这里:

Route::pattern('id', '[0-9]+');
Route::pattern('cat', '^(?!create$)[^/]*');
Route::pattern('slug', '^(?!edit$)[^/]*');

Route::get('articles/{id}/{cat?}/{slug?}', function($id, $cat, $slug)
{
    dd($id.': ' . $cat . ' | 2:' . $slug);
});