如何向Laravel 4 Route添加slug和ID URL?

时间:2014-02-22 03:35:08

标签: php .htaccess laravel-4

我想在我的Laravbel项目中添加不错的Slug网址。我目前正在使用身份证号码。

我的目标是继续使用Numbers,但也使用Slugs来获得更好的SEO URL。因此,Slug或ID都会加载正确的页面。

以下是我当前使用ID号加载记录的Route

// View Campaign Details/Profile/Map View
Route::any("/campaign/{id}", array(
    "as"   => "campaign/{id}",
    "uses" => "CampaignController@getCampaignMap"
));

能够在Laravel 4中添加Slug支持。我相信我需要在我的广告系列表中添加一个slug数据库列。

如何编辑我的路线以使用slug字符串的ID号?

另外,因为我只想在我的应用程序的几个部分使用slug,我如何为此执行my.htaccess,或者甚至需要一个.htaccess?

3 个答案:

答案 0 :(得分:6)

我不会将两个参数传递给您的函数,只是在两种情况下都将其视为ID。如果你还没有,你需要在数据库中添加一个“slug”列,并确保这些值与id一样唯一。然后在您的控制器中,您可以执行以下操作:

public function getCampaignMap($id){
    //look for the campaign by id first
    $campaignmap  = Campaign::find($id);
    //if none is found try to find it by slug instead
    if(!$campaignmap){
        $campaignmap = Campaign::where('slug','=',$id)->firstOrFail();
    }
    return View::make('campaignmap.show', compact('campaignmap'));
}

在某些情况下,您还可以通过检查id是否为数字来保存自己的查询,如果它不是数字,则只需通过slug查找:

public function getCampaignMap($id){
    //look for the campaign by id if it's numeric and by slug if not
    if(is_numeric($id)){
         $campaignmap  = Campaign::find($id);
    }else{
         $campaignmap = Campaign::where('slug','=',$id)->firstOrFail();
    }
    return View::make('campaignmap.show', compact('campaignmap'));
}

答案 1 :(得分:5)

已经有一个流行的软件包来处理slug及其可能的问题:https://github.com/cviebrock/eloquent-sluggable

它可以处理为先前使用的slugs添加id后缀的唯一性,检测是否要覆盖软删除的slugs以及其他一些海关配置。

答案 2 :(得分:2)

考虑使用RESTful控制器,这将根据控制器和函数名称生成一个URL:

Route::controller('users', 'UserController');

另外,我很确定资源控制器会做同样的事情,尽管我还没有使用它们:

Route::resource('photo', 'PhotoController');

如果您仍想定义路线,我会在您的数据库中添加一个slug列,然后您的路线将是:

// View Campaign Details/Profile/Map View
Route::any("/campaign/{slug}", array(
    "as"   => "campaign",
    "uses" => "CampaignController@getCampaignMap"
));

请记住,slug必须是唯一的。

在您的控制器中:

public function getCampaignMap($slug)
{
    $campaignmap = YourModel::where('slug', '=', $slug)->get();
}

如果您愿意,您仍然可以传入ID:

// View Campaign Details/Profile/Map View
Route::any("/campaign/{slug}/{id}", array(
    "as"   => "campaign",
    "uses" => "CampaignController@getCampaignMap"
));

然后,在你的控制器中:

public function getCampaignMap($slug, $id)
{
    $campaignmap = YourModel::find($id);
}

希望有所帮助!