felixkiss / slug-routes
Laravel 4: 带slug的路由模型绑定
Requires
- php: >=5.3.0
- illuminate/support: 4.0.x
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 许可协议许可。