我需要对所有 url id 进行加密,如下所示:
user/edit/1
items/edit/35
posts/details/52
到
user/edit/sdfjk54dfds
items/edit/sdfjk54dfds
posts/details/sdfjk5s4dfds
有很多像
blade
文件这样的区域,在 controllers
中,id 使用了 url('items/edit/2')
,并且在控制器中,一些函数是由像 public function itemedit(Items $items)
这样的对象传递的。
我尝试了
$encrypt_val = Crypt::encrypt($value)
和$decrypt_val = Crypt::decrypt($encrypt_val );
,但我需要在任何地方都这样做。
有什么捷径或中间件功能可以做到这一点吗?
使用 Laravel Hashids
您可以像下面这样对 id 进行编码
$encoded_id = Hashids::encode($id);
您的网址将如下所示
<url>/users/edit/sdfjk54dfds
您可以使用
Uuid
而不是使用整数 id
。为此,请按照说明进行操作:
只需创建一个
trait
:
trait Uuids
{
/**
* Boot function from laravel.
*/
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
$model->{$model->getKeyName()} = Uuid::generate()->string;
});
}
}
并在您的模型中使用上述特征:
use SomeNamespcaeOfTrait;
class User extends Eloquent
{
use Uuids;
/**
* @var bool
*/
public $incrementing = false;
}
并在迁移中使用
uuid
而不是 integer
。
有一个名为 Laravel HashSlug 的包可以按照需要运行。与 sumit 的答案类似,它是基于 Hashids 构建的,但专门设计用于处理 url。
使用上面的包,您需要做的就是在控制器中添加特征和类型提示:
class Post extends Model {
use HasHashSlug;
}
// routes/web.php
Route::resource('/posts', 'PostController');
// app/Http/Controllers/PostController.php
public function show(Post $post){
return view('post.show', compact('post'));
}