Правило проверки 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, чтобы увидеть все, что я делаю.

Удачного кодирования!