首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用存储库模式加密URL (laravel 9)中的所有I

如何使用存储库模式加密URL (laravel 9)中的所有I
EN

Stack Overflow用户
提问于 2022-09-12 04:48:42
回答 1查看 315关注 0票数 3

我需要做所有加密的url I,例如:

代码语言:javascript
复制
user/edit/1
items/edit/35
posts/details/52

到url路径以下

代码语言:javascript
复制
user/edit/gd43dfrg
items/edit/sdfg4343
posts/details/fasdf23423

存储库模式中有许多区域,如UserRepositoryUserController刀片文件和控制器中使用了url ('items/edit/2')

但是,在控制器中,也有一些函数由对象传递,如

代码语言:javascript
复制
public function itemedit(Items $items)

我试过了

代码语言:javascript
复制
$encrypt_val = Crypt::encrypt($value) and $decrypt_val = Crypt::decrypt($encrypt_val );

但我需要在整个应用程序上都这么做。有什么简单的方法或中间件可以使用存储库模式来完成吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-12 11:06:28

正确的方法是这样做:

使用服务提供者的任何boot函数(例如,RouteServiceProvider)来定义应该如何调用路由参数:

代码语言:javascript
复制
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时

代码语言:javascript
复制
Route::get('/orders/{order}', /*...*/);

您的控制器方法将在其签名中接收预期的顺序,即

代码语言:javascript
复制
public function show(Request $request, Order $order) {
    //
}

要改进这段代码,可以在雄辩的模型上定义getRouteKey()函数( UrlRoutable特性的一部分),以简化路由的创建,从而可以调用route('orders.show', $order)

代码语言:javascript
复制
// App/Models/Order.php
public function getRouteKey()
{
    return yourEncodeFunction($this->getKey());
}

这将确保在将完整的对象传递给路由调用时自动标识路由参数(如果您自己不覆盖此函数,则使用模型的主键)。

如果您只想混淆一些url,https://packagist.org/packages/hashids/hashids可能是一个很好的包(请注意,这个包是一个‘编码器’,而不是‘加密器’)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73684600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档