Правило проверки Laravel - десятичные дроби
В этой новой серии мы рассмотрим концепцию настраиваемых правил проверки в Laravel и то, как они могут вам помочь. Я каждый день публикую статью с новым правилом, которое вы можете использовать в своих проектах. Правила также являются частью пакета.
В этом посте мы создадим правило, подтверждающее, что пользователь ввел десятичное значение заданной длины и масштаба, например 1234,56.
Если вы новичок в этой теме, ознакомьтесь с первой статьей в этой серии.
Повышение
Недавно я выпустил Pulse - удобную и доступную службу мониторинга серверов и сайтов, разработанную специально для разработчиков. Он включает в себя все обычные аппаратные мониторы, мониторы настраиваемых сервисов, оповещения через различные каналы уведомлений, журналы, а также полную поддержку API. Взгляните… https://pulse.alphametric.co
Проверка и ответ
Давайте начнем с написания логики, необходимой для обеспечения того, чтобы пользователь ввел действительное десятичное число. Для этого нашему правилу потребуется принять параметр length
и параметр scale
. Затем мы можем вставить эти параметры в регулярное выражение, которое составляет основу метода passes
:
public function passes($attribute, $value) { return preg_match("/^[0-9]{1,{$this->parameters[0]}}(\.[0-9]{1,{$this->parameters[1]}})$/", $value); }
Выражение позволяет пользователю указывать любое количество цифр перед точкой до предоставленного параметра length
. Точно так же выражение позволяет пользователю указывать любое количество цифр после точки до предоставленного параметра scale
.
Так, например, new Decimal(4, 2)
позволит пользователю указать такие значения, как 12.0
, 123.4
и 1234.56
, но не 1234.567
или 12345.67
.
Затем нам нужно будет написать сообщение об ошибке, чтобы реагировать, когда пользователь ввел десятичное число, не соответствующее критериям. Чтобы помочь им исправить свою ошибку, мы также можем создать example
метод:
public function example() { return mt_rand(1, (int) str_repeat('9', $this->parameters[0])) . '.' . mt_rand(1, (int) str_repeat('9', $this->parameters[1])); } // ... public function message() { return 'The :attribute must be an appropriately formatted decimal e.g. ' . $this->example(); }
Тестирование работает
Как и раньше, мы напишем быстрый модульный тест, чтобы убедиться, что правило работает правильно и отклоняет значения, которые не отформатированы должным образом:
/** @test */ public function a_decimal_can_be_validated() { $rule = ['figure' => [new Decimal(4, 2)]]; $this->assertFalse(validator(['figure' => '1'], $rule)->passes()); $this->assertFalse(validator(['figure' => '123'], $rule)->passes()); $this->assertFalse(validator(['figure' => '1234'], $rule)->passes()); $this->assertFalse(validator(['figure' => '1234.'], $rule)->passes()); $this->assertTrue(validator(['figure' => '1234.5'], $rule)->passes()); $this->assertTrue(validator(['figure' => '1234.56'], $rule)->passes()); $this->assertFalse(validator(['figure' => '1234.567'], $rule)->passes()); $this->assertTrue(validator(['figure' => '1234.0'], $rule)->passes()); $this->assertTrue(validator(['figure' => '1234.00'], $rule)->passes()); }
Заключение
Вы можете увидеть полный класс и вставить его в свои проекты, посетив репо на Github: https://github.com/alphametric/laravel-validation-rules
У меня есть дополнительные правила проверки, которыми я намерен поделиться с вами в ближайшие дни, так что не забудьте подписаться на мои статьи. Если вам интересно, вы также можете подписаться на меня в Twitter, чтобы увидеть все, что я делаю.
Удачного кодирования!