codezero / laravel-route-key-exists
Laravel 验证规则,用于检查自定义路由键是否存在。
Requires
- php: >=7.0.0
Requires (Dev)
- orchestra/testbench: ~3.5.0
- phpunit/phpunit: ~6.0
This package is auto-updated.
Last update: 2024-09-11 14:27:00 UTC
README
Laravel 验证规则,用于检查自定义路由键是否存在。
Laravel 的 exists
规则会检查数据库表中是否存在具有给定值的列。此验证规则通过在模型上使用 resolveRouteBinding()
方法来检查给定值是否存在。
要求
- PHP >= 7.0
- Laravel >= 5.5
安装
通过 Composer 需求此包
composer require codezero/laravel-route-key-exists
一些背景信息
Laravel 的 隐式路由模型绑定 允许您通过在控制器中类型提示来自动解析模型。此外,您还可以更改模型中用于查询数据库的路由键
public function getRouteKeyName() { return 'id'; }
当您在模型中使用自定义或计算的路由键时,这也同样适用
public function getRouteKey() { // "encode" the route key return "foo-{$this->id}"; } public function resolveRouteBinding($value) { // "decode" the route key $id = (int) str_replace('foo-', '', $value); // resolve from the database return $this->where('id', $id)->first(); }
但是,如果您在 POST 请求中发送自定义键并希望对其进行验证,则与 Laravel 的 exists
规则不同,此验证规则使用 resolveRouteBinding()
方法来检查键是否有效。
用法
假设您有一个 ID 为 1
的模型,但 getRouteKey()
返回的编码值为 1234
。
在验证规则中,将您的模型类名传递给 \CodeZero\RouteKeyExists\RouteKeyExists
request()->validate([ 'model_id' => RouteKeyExists::model(Model::class), ]);
在这里,model_id
是编码值,它将通过模型上的 resolveRouteBinding()
方法进行解析。如果不能解析,则验证失败。
可能需要实际 ID 来在验证通过时进行操作。将 replace()
添加到规则中,并将 model_id
更新为实际 ID
request()->validate([ 'model_id' => RouteKeyExists::model(Model::class)->replace(), ]); $id = request('model_id'); // actual ID
如果您的表单使用与模型或数据库不同的属性名,您可以在处理过程中替换 ID 和属性名。
request()->validate([ 'model' => RouteKeyExists::model(Model::class)->replace('model_id'), ]); $id = request('model_id'); // actual ID //$id = request('model'); // null
或者,您可能希望保留请求中的编码 ID,但添加实际 ID。只需将 add()
添加到规则中,并指定一个属性名
request()->validate([ 'model_id' => RouteKeyExists::model(Model::class)->add('actual_id'), ]); $id = request('actual_id'); // actual ID $key = request('model_id'); // route key
请注意,动态添加到请求中的属性不会包含在 request()->validate()
返回的数组中。您可以通过 request('attribute_name')
访问这些属性。
有用的包
- 此规则与
laravel-optimus
模型特性一起工作得非常好。
测试
vendor/bin/phpunit
安全性
如果您发现任何与安全相关的问题,请通过 电子邮件 联系我,而不是使用问题跟踪器。
变更日志
请参阅 变更日志 中的重要更改列表。
许可证
MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件。