你可以做到。如果您想将参数用作slug/string 而不是id/numeric,这并不重要。只需像为数字 id 参数声明的方式一样声明路由。例如,你可以这样声明一个路由:
Route::get(
'/products/{title}',
array('uses' => 'ProductController@show', 'as' => 'product.show')
);
那么,这条路由的URL 可能是http://yourdomain.com/products/name-of-product。
人们使用id 的原因是,大多数情况下人们在他们的数据库中使用auto-incremented 数字id 和primary key,使用类似的东西是一个好主意,这将是独一无二的。您只需确保您的产品也是独一无二的,然后使用以下命令将它们作为 slug 插入数据库中:
$product->title = Str::slug(Input::get('product_title'));
另外,你可以在你的路由中使用 where 条件来确保提供给路由的产品名称是一个字符串,如下所示:
Route::get(
'/products/{title}',
array('uses' => 'ProductController@show', 'as' => 'product.show')
)->where('title', '[A-Za-z-]+');
这是我出于相同原因使用的宏(从 Slug 到 Title):
Str::macro('toTitle', function($str){
return ucwords(str_replace('-', ' ', $str));
});
您也可以使用普通的辅助函数,如果需要,您也可以使用preg_replace。