Laravel: определение правил или схемы для поля / столбца json - PullRequest
0 голосов
/ 29 июня 2018

В моей базе данных есть столбец, который имеет тип json: values.
Но мне нужно применить схему.

  • Это должен быть массив
  • Каждый объект должен иметь 2 и только 2 свойства (обязательно). code_name и description
  • code_name должен быть уникальным внутри этого массива JSON

Есть ли в Laravel какая-то готовая функция для этого? или мне нужно вручную декодировать JSON при создании и обновлении для проверки этих правил?

До сих пор. У меня есть только эти правила проверки в моей модели:

/**
 * The model validation rules.
 *
 * @var array
 */
public static $rules = [
    'values' => 'required|json', // TO BE CHECKED (values validation (json schema) and setter)
];

Но этого недостаточно.

Важно : это не повторяющийся вопрос к: Laravel: проверить объект json

1 Ответ

0 голосов
/ 30 июня 2018

Laravel поддерживает добавление собственных правил проверки.

Чтобы создать правило проверки, вы должны создать новый класс, который реализует интерфейс Illuminate\Contracts\Validation\Rule.

Ремесленная команда php artisan make:rule {NAME} автоматически создает шаблон правила для вас в пространстве имен App\Rules.

Проще говоря, вы пишете passes($attribute, $value) функцию, которая возвращает логическое значение, которое определяет, будет ли проверка завершена неудачно или успешно.

Я написал пример, основанный на ваших требованиях ниже.

Пример

<?php
namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class ValuesSchemaRule implements Rule
{
    private $validProperties = ['code_name', 'description'];

    public function __construct()
    {
    }

    public function passes($attribute, $value)
    {
        $array = json_decode($value);

        if (is_array($array) === false) {
            return false;
        }

        $codeNames = [];

        foreach ($array as $object) {
            $properties = get_object_vars($object);

            if (count($properties) !== 2) {
                return false;
            }

            $propertyNames = array_keys($properties);

            if (in_array($this->validProperties, $propertyNames) === false) {
                return false;
            }

            array_push($codeNames, $object->code_name);
        }

        if (count($codeNames) !== count(array_unique($codeNames))) {
            return false;
        }

        return true;
    }

    public function message()
    {
        return 'The values does not comply to the JSON schema';
    }
}

Чтобы добавить его в проверку вашей модели, вам нужно просто присвоить свойство 'values' новому экземпляру вашего класса Rule:

/**
 * The model validation rules.
 *
 * @var array
 */
public static $rules = [
    'values' => new ValuesSchemaRule,
];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...