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,
];