【问题标题】:Get a parameter from a route?从路由中获取参数?
【发布时间】:2016-12-28 23:27:35
【问题描述】:

我有以下路线:

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

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

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

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

我不能把它变成一个路由参数,例如

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

因为还有其他部分,例如联系方式、常见问题解答等,不使用文章控制器。

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

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. 是否有一种简单的方法可以指定到同一资源的不同路由?

【问题讨论】:

  • 将静态路由置于动态路由之上

标签: laravel laravel-5 laravel-5.2


【解决方案1】:

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

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

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

【讨论】:

  • 这样不行,getIndex 函数将无法区分这两个路由。除非有进一步的路线检查
  • @MinaAbadir 我刚刚给出了这个想法,没有具体说明函数名称,只是最终保持动态路线是我的意图
  • 我理解你的观点。我只是指出答案的一个问题。
  • 不,我认为这会起作用。第一个 getIndex 函数正在 ContactController 上调用。然后第二个将能够区分新闻/旅行,因为它被传递了。
【解决方案2】:

为了实现这样的路线:

mydomain.com/category-slug/article-slug

使用以下内容:

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

然后在您的控制器中,您的 getArticle 方法中将有 2 个参数。

public function getArticle($category, $article)
{
    //Your code here
}

【讨论】:

    【解决方案3】:

    为了获得漂亮的网址,您需要执行几个步骤:
    1) 首先,您需要在您的文章表中添加一列,例如“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 中工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      相关资源
      最近更新 更多