zschuessler/model-json-attribute-guard-laravel

为您的json列提供一致性的直观且有趣的方式

1.0.1 2020-08-27 19:38 UTC

This package is not auto-updated.

Last update: 2024-09-21 13:41:32 UTC


README

此包允许对JSON列进行验证和自定义类型转换。

您是否曾经尝试使用json列,并且

  1. 验证列的架构很困难或很混乱
  2. 查询列很费力
  3. 在保存模型时进行类型转换并不有趣

但现在您可以放心了!

示例

您想要保存用户偏好。这是一些高度动态的数据,所以您将其放入json列

以下是问题

  1. 您能强制每个键有效吗?
  2. 您能强制两个日期都是有效日期吗?
  3. 关于始终确保列是一个数组,无论是否存在偏好,怎么办?

我们可以。

步骤1:创建验证器类

让我们使用Laravel自己的验证器语法来描述我们想要的内容。

<?php
namespace App\Models\User;

use Zschuessler\ModelJsonAttributeGuard\JsonAttributeGuard;

class PreferencesJsonColumn extends JsonAttributeGuard
{

    public function schema() : array
    {
        return [
            // Use wildcard syntax to apply rules to all children
            '*.name'           => 'required',
            '*.value'          => 'required|min:3',
            '*.date_created'   => 'present|nullable|date',
            '*.date_updated'   => 'present|nullable|date',
        ];
    }
}

底层使用Laravel的验证器:您可以使用任何规则。尽情使用吧。

步骤2:向您的模型添加特性并进行类型转换

让我们告诉Laravel我们想要我们的模型执行自定义类型转换

<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Models\User\PreferencesJsonColumn;
use Zschuessler\ModelJsonAttributeGuard\Traits\HasJsonAttributeGuards;

class User extends Model
{
    use HasJsonAttributeGuards;

    public $casts = [
        'preferences' => PreferencesJsonColumn::class
    ];

步骤3:成功

这段代码将表现得非常好

$user->preferences = [
    [
        'name' => 'Favorite Band',
        'value' => 'Slenderbodies',
        'date_created' => '2019-09-15',
        'date_updated' => '2020-01-01'
    ]
];
$user->save();

太好了!但是下面的代码将抛出JsonAttributeValidationFailedException异常——哦不!您的模型将无法保存。

$user->preferences = [
    'name' => null,
    'value' => null,
    'date_created' => null,
    'date_updated' => null,
];
$user->save();

这是一个简单的示例。可能性是无限的!