从路线获取参数?

时间:2016-08-22 12:03:25

标签: laravel laravel-5 laravel-5.2

我有以下路线:

Route::get('news', [
    'as' => 'news',
    'uses' => 'ArticleController@getIndex',
]);

还有其他路由使用相同的资源控制器,例如:

Route::get('travel', [
    'as' => 'travel',
    'uses' => 'ArticleController@getIndex',
]);

在文章控制器中,我如何获得文章的类别。例如旅行还是新闻?

我无法将其变成路线参数,例如。

Route::get('{travel}', [
    'as' => 'travel',
    'uses' => 'ArticleController@getIndex',
]);

由于还有其他部分,例如contact,faqs等,不使用文章控制器。

我知道我可以把它全部放在一条路上:

Route::get('/article/{category}', [
    'as' => 'travel',
    'uses' => 'ArticleController@getIndex',
]);

但我想要漂亮的URL,如:

mydomain.com/category-slug/article-slug

理想情况下,如果我可以使用资源控制器:

Route::resource('news', ArticleController');

使用某种数组:

Route::resource(['news', 'travel'], ArticleController');

所以我的问题:

  1. 如何获取资源的名称。例如新闻,在我的控制器中旅行?

  2. 是否有一种简单的方法可以指定到同一资源的不同路由?

3 个答案:

答案 0 :(得分:4)

例如保持这样的路由作为您的静态路由将是有限的,并且需要是唯一的,这样它们就不会在路由之间产生冲突 演示路线:

Route::get('contact', [
    'as' => 'contact',
    'uses' => 'contactController@getIndex',
]);

Route::get('{travel}', [
    'as' => 'travel',
    'uses' => 'ArticleController@getIndex',
]);

答案 1 :(得分:1)

为了达到这样的路线:

Route::get('/{category}/{article}', 'ArticleController@getArticle');

使用以下内容:

getArticle

然后在您的控制器中,您的public function getArticle($category, $article) { //Your code here } 方法中将包含2个参数。

DefMenuItem

答案 2 :(得分:0)

为了获得漂亮的网址,您需要执行以下步骤:
1) 首先,您需要在article表中添加一个列,例如' slug'。
2)然后,您需要在文章模型中指定路线密钥。像这样:
文章模型

public function getRouteKeyName()
{
    return 'slug';
}

3)当你添加一篇文章时,你应该自己创建一个slug才能是唯一的。所以在您创建文章的控制器中添加此代码。

$slug = str_slug($article['title'], '-');
$slugs_count = DB::table('articles')->where('name',$article['title'])-  >count();
if($slugs_count>1){
    $slug = $slug.'-'.($slugs_count-1);
}
$article->slug = $slug;
$article->update();

4)现在我们必须设置路线

Route::get('/article/{slug}', [
    'as'   => 'travel',
    'uses' => 'ArticleController@getIndex'
])->where(['slug','[\w\d\-\_]+']);

5)最后,为了得到你需要的文章

$article = Article::where('slug','=',$slug)->first();

如果您想使用类别等,您可以在路线中传递更多参数并在控制器中对其进行操作。像这样

Route::get('/article/{category}/{slug}', [
    'as'   => 'travel',
    'uses' => 'ArticleController@getIndex'
])->where(['slug','[\w\d\-\_]+','category','[\w\d\-\_]+']);

where子句用一些正则表达式限制参数(可选)。 我忘了提到模型中的routekeyname在laravel 5.2中工作。