felixkiss/slug-routes

此包已被弃用且不再维护。未建议替代包。

Laravel 4: 带slug的路由模型绑定

dev-master 2013-08-30 09:27 UTC

This package is auto-updated.

Last update: 2022-02-01 12:26:49 UTC


README

如果您正在使用Laravel 4中的路由模型绑定功能,slug-routes允许您使用一些独特的数据来表示URL中的记录,而不仅仅是ID。这可以帮助优化您的URL以适应搜索引擎,并且通常会给您的用户更好的机会理解您的Web应用程序的功能。

安装

安装包

通过Composer安装包。

在您的composer.json文件中

{
    "require": {
        "laravel/framework": "4.0.*",
        "felixkiss/slug-routes": "dev-master"
    }
}

运行composer update以安装包。

配置Laravel

将以下内容添加到config/app.php文件中的providers数组中

'providers' => array(
    // ...

    'Felixkiss\SlugRoutes\SlugRoutesServiceProvider',
),

使用方法

在以下示例中,我只使用Closure回调路由。在我的实际应用程序中,我始终使用控制器路由,但闭包可以使其更简单、更清晰,我认为这更适合展示此包的功能。

路由模型绑定

路由模型绑定是Laravel的一个非常酷的特性。它允许您为您的路由指定一个特殊的参数类型,以便将模型实例注入到您的路由中。例如,您可以使用以下方式代替标准操作:

// Access via http://example.com/users/1
Route::get('users/{id}', function($id)
{
    $user = User::find($id);

    if(is_null($user))
        App::abort(404);

    return View::make('users.show', compact('user'));
});

您可以定义一个路由参数{user},它接受一个id并为您检索记录。如果不存在具有现有ID的用户,它甚至可以引发404。

// Access via http://example.com/users/1
Route::model('user', 'User');
Route::get('users/{user}', function(User $user)
{
    return View::make('users.show', compact('user'));
});

这可以删除很多样板代码,因为您可以在任何数量的路由中重复使用此{user}

问题

这非常方便,但如果您想要具有SEO/用户友好的URL,如/users/taylor-otwell而不是/users/1呢?基本上,您有三个选项

选项1 - 旧式路由

Route::get('users/{slug}', function($slug)
{
    $user = User::where('slug', $slug);

    if(is_null($user))
        App::abort(404);

    return View::make('users.show', compact('user'));
});

这很好,但我们想要摆脱样板。这就是我们最初开始使用Route::model()的原因。

选项2 - Route::bind()

Route::bind('user', function($value, $route)
{
    return User::where('slug', $value)->first();
});

文档中提到,如果想要自定义URL与模型匹配,这种方法是可行的。它运行良好,但我认为不一定总是在 routes.php 文件中定义这类事情是正确的。

选项3 - 使用 slug-routes

这个包提供了 SluggableInterface,您可以在您的模型类中实现它。如果您这样做,Route::model('user', 'User') 将会识别它,并自动绑定到 getSlugIdentifier() 返回的数据库列。如果您没有实现该接口,它将简单地回退到 Route::model() 提供的默认行为。

示例

模型

<?php

use Felixkiss\SlugRoutes\SluggableInterface;

class User extends Eloquent implements SluggableInterface
{
    // ...

    /**
     * Use 'slug' db column as the identifier in URLs for this model.
     * Should be URL friendly and unique to avoid collisions.
     *
     * @return string
     */
    public function getSlugIdentifier()
    {
        return 'slug';
    }
}

routes.php:

// Bind {user} to User model
// If model implements SluggableInterface, it will try to match
// the value to the column specified by getSlugIdentifier()
// If model doesn't implement SluggableInterface, it will fallback
// to the default behaviour of using id.
Route::model('user', 'User');

Route::get('users/{user}', array('as' => 'users.show', function()
{
    return View::make('users.show', compact('user'));
}));

一个完整的示例,包括带有缩略语的User模型、Users控制器、视图,可以在 GitHub上找到

许可

slug-routes 是开源软件,受 MIT 许可协议许可。