我需要做所有加密的url I,例如:
user/edit/1
items/edit/35
posts/details/52到url路径以下
user/edit/gd43dfrg
items/edit/sdfg4343
posts/details/fasdf23423存储库模式中有许多区域,如UserRepository、UserController刀片文件和控制器中使用了url ('items/edit/2')。
但是,在控制器中,也有一些函数由对象传递,如
public function itemedit(Items $items)我试过了
$encrypt_val = Crypt::encrypt($value) and $decrypt_val = Crypt::decrypt($encrypt_val );但我需要在整个应用程序上都这么做。有什么简单的方法或中间件可以使用存储库模式来完成吗?
发布于 2022-09-12 11:06:28
正确的方法是这样做:
使用服务提供者的任何boot函数(例如,RouteServiceProvider)来定义应该如何调用路由参数:
public function boot()
{
// Bind any `{order}` route parameter such that it decodes the value before retrieving the order.
Route::bind('order', function ($value) {
return User::query()->where('id', $this->yourDecodeFunction($value))->firstOrFail();
});
}现在,当您从一个路由创建像route('orders.show', yourEncodeFunction($order->id))这样的urls时
Route::get('/orders/{order}', /*...*/);您的控制器方法将在其签名中接收预期的顺序,即
public function show(Request $request, Order $order) {
//
}要改进这段代码,可以在雄辩的模型上定义getRouteKey()函数( UrlRoutable特性的一部分),以简化路由的创建,从而可以调用route('orders.show', $order)
// App/Models/Order.php
public function getRouteKey()
{
return yourEncodeFunction($this->getKey());
}这将确保在将完整的对象传递给路由调用时自动标识路由参数(如果您自己不覆盖此函数,则使用模型的主键)。
如果您只想混淆一些url,https://packagist.org/packages/hashids/hashids可能是一个很好的包(请注意,这个包是一个‘编码器’,而不是‘加密器’)。
https://stackoverflow.com/questions/73684600
复制相似问题