Рубрики
Uncategorized

Правила проверки Laravel — Домены, идентификационные номера граждан, ноль пробелов…

Изображение любезно предоставлено правилами проверки Unsplash Laravel — доменные имена, идентификация гражданства… Помечено как laravel, проверка, php.

Изображение любезно предоставлено Расплескать

Правила проверки Laravel — доменные имена, идентификационные номера граждан и строки без пробелов

В этой новой серии мы рассмотрим концепцию пользовательских правил проверки в Laravel и то, как они могут вам помочь. Каждый день я публикую статью с новым правилом, которое вы можете использовать в своих проектах. Правила также являются частью пакета .

В этом посте мы создадим три новых правила для проверки:

  1. Доменные имена без протокола http(s).
  2. Идентификационные номера граждан США, Великобритании и Франции.
  3. Строки имеют нулевые пробелы в начале, середине и конце.

Если вы новичок в этой теме, ознакомьтесь с первой статьей из серии, а также с этой статьей , чтобы узнать, как использовать параметры в ваших правилах.

Продвижение

Недавно я выпустил Pulse — удобный, доступный сервис мониторинга серверов и сайтов, разработанный специально для разработчиков. Он включает в себя все обычные аппаратные мониторы, пользовательские сервисные мониторы, оповещения по различным каналам уведомлений, журналы, а также полную поддержку API. Взгляните… Взгляните…

Мониторинг сервера и сайта с Пульс

Правило №1 — Доменные имена

Мы начнем с простого. Мы хотим разрешить пользователю указывать доменное имя, но оно не должно включать протокол HTTP (s) или фактический маршрут URL, например/pages/welcome/index.html

Излишне говорить, что самый быстрый подход – использовать регулярное выражение для проверки этих требований, поэтому давайте вставим эту логику в метод passes:

public function passes($attribute, $value)
{
    return preg\_match(
        "/^([a-zA-Z0-9][a-zA-Z0-9-\_]\*\.)\*[a-zA-Z0-9]\*[a-zA-Z0-9-\_]\*
        [[a-zA-Z0-9]+$/", $value
    );
}

Далее нам нужно будет написать сообщение об ошибке для ответа, когда пользователь указал значение, которое не является допустимым доменом:

public function message()
{
    return 'The :attribute must be a valid domain without an http 
            protocol e.g. google.com, www.google.com';
}

Как и прежде, мы напишем быстрый модульный тест, чтобы подтвердить, что правило работает правильно и отклоняет значения, которые не являются исключительно доменами:

/\*\* @test \*/
public function the\_domain\_rule\_can\_be\_validated()
{
    $rule = ['domain' => [new Domain]];

    $this->assertFalse(validator(['domain' => 'http://'], $rule)->passes());

    $this->assertFalse(validator(['domain' => 'https://'], $rule)->passes());

    $this->assertFalse(validator(['domain' => 'http://google.com'], $rule)->passes());

    $this->assertFalse(validator(['domain' => 'https://google.com'], $rule)->passes());

    $this->assertFalse(validator(['domain' => 'http://google'], $rule)->passes());

    $this->assertFalse(validator(['domain' => 'https://google'], $rule)->passes());

    $this->assertTrue(validator(['domain' => 'google.com'], $rule)->passes());

    $this->assertTrue(validator(['domain' => 'www.google.com'], $rule)->passes());

}

Правило №2 — Идентификационные номера граждан

Затем мы добавим правило для проверки того, был ли предоставлен номер социального страхования или его эквивалент. Нам нужно будет принять один параметр, который будет использоваться правилом, чтобы решить, регулярное выражение какой страны следует использовать:

public function passes($attribute, $value)
{
    switch (mb\_strtolower($this->parameters[0] ?? 'usa')) {

        case 'usa':
            return preg\_match("/^(?!000|666)[0-8][0-9]{2}-(?!00)[0-
                               9]{2}-(?!0000)[0-9]{4}$/", $value);

        case 'uk':
            return preg\_match("/^[A-CEGHJ-PR-TW-Z]{1}[A-CEGHJ-NPR-
                               TW-Z]{1}[0-9]{6}[A-DFM]{0,1}$/", 
                              $value);

        case 'fr':
            return preg\_match("/^[1,2][]?[0-9]{2}[]?[0,1,2,3,5][0-
                               9][]?[0-9A-Z]{5}[]?[0-9]{3}[]?[0-
                               9]{2}$/", $value);

        default:
            return false;

    }
}

ПРИМЕЧАНИЕ : Я добавил только несколько национальных примеров (США, Великобритания, Франция), но вы можете легко добавить свой собственный, если вам нужно подтвердить номер из другой страны.

Как и прежде, нам нужно будет написать сообщение об ошибке, чтобы ответить:

public function message()
{
    return 'The :attribute must be a valid form of identification';
}

И, наконец, включите некоторые модульные тесты:

/\*\* @test \*/
public function the\_citizen\_identification\_rule\_can\_be\_validated\_for\_usa()
{

    $rule = ['id' => [new CitizenIdentification('usa')]];

    $this->assertFalse(validator(['id' => 'XXX-XX-XXXX'], $rule)->passes());

    $this->assertFalse(validator(['id' => '000-11-1111'], $rule)->passes());

    $this->assertTrue(validator(['id' => '401-60-1048'], $rule)->passes());

    $this->assertTrue(validator(['id' => '318-66-9044'], $rule)->passes());

}

/\*\* @test \*/
public function the\_citizen\_identification\_rule\_can\_be\_validated\_for\_uk()
{

    $rule = ['id' => [new CitizenIdentification('uk')]];

    $this->assertFalse(validator(['id' => 'DC135798A'], $rule)->passes());

    $this->assertFalse(validator(['id' => 'FQ987654C'], $rule)->passes());

    $this->assertTrue(validator(['id' => 'JG103759A'], $rule)->passes());

    $this->assertTrue(validator(['id' => 'AP019283D'], $rule)->passes());

}

/\*\* @test \*/
public function the\_citizen\_identification\_rule\_can\_be\_validated\_for\_france()
{

    $rule = ['id' => [new CitizenIdentification('fr')]];

    $this->assertFalse(validator(['id' => 'DC135798A'], $rule)->passes());

    $this->assertFalse(validator(['id' => 'FQ987654C'], $rule)->passes());

    $this->assertTrue(validator(['id' => '1 51 02 46102 043 25'], $rule)->passes());

}

Правило №3 — Без пробелов

Наше окончательное правило подтвердит, что предоставленные входные данные не содержат пустых пробелов. Для случаев, когда пользователь может быть склонен использовать пробелы, например, банковские карты, но когда вы не можете их принять, это правило идеально подходит.

Как вы можете себе представить, мы можем использовать до боли простое регулярное выражение:

public function passes($attribute, $value)
{
    return ! preg\_match("/\s/", $value);
}

Мы также включим ответ на ошибку:

public function message()
{
    return 'The :attribute must not contain any spaces';
}

И модульный тест:

/\*\* @test \*/
public function the\_without\_whitespace\_rule\_can\_be\_validated()
{

    $rule = ['text' => [new WithoutWhitespace]];

    $this->assertFalse(validator(['text' => 'hello '], $rule)->passes());

    $this->assertFalse(validator(['text' => ' hello'], $rule)->passes());

    $this->assertFalse(validator(['text' => 'hello world'], $rule)->passes());

    $this->assertTrue(validator(['text' => 'hello'], $rule)->passes());

}

Завершая

Вы можете просмотреть классы и включить их в свои проекты, посетив репозиторий на Github: https://github.com/alphametric/laravel-validation-rules

К настоящему времени вы должны быть хорошо знакомы с процессом создания пользовательских правил для проверки ввода в ваших приложениях Laravel. Кроме того, поскольку пакет теперь содержит более 25 правил, это кажется хорошим моментом для завершения серии.

Я надеюсь, что вы нашли это полезным и сочтете пакет достойным включения в ваши установки Laravel по умолчанию. Теперь я перейду к другим проектам, которые надеюсь задокументировать здесь в ближайшем будущем.

Если вам интересно узнать о них, вы можете подписаться на меня здесь или также на Твиттер для случайного беглого взгляда.

Спасибо, что следите за серией, и счастливого кодирования!

Оригинал: “https://dev.to/mattkingshott/laravel-validation-rules-domains-citizen-identification-numbers-zero-whitespace-1kk8”