Многие веб-фреймворки предлагают инструмент проверки внутренних данных, но я думаю, что им не хватает инструмента проверки данных внешнего интерфейса, как будто мы должны искать и добавлять эту функциональность.

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

При использовании Laravel 10 с Livewire, это потрясающий стек, в нем отсутствует инструмент проверки внешнего интерфейса, поэтому я изучаю проверку формы Javascript с помощью Alpine.Js (принесите с Livewire) и Ionide.Js, найденных на Github.

Я пишу здесь, потому что Ionide.Js был сильно переписан с многочисленными критическими изменениями, что означает, что предыдущие статьи больше не работают полностью, но по-прежнему являются отличным источником вдохновения, которые вам следует прочитать:

Вот скелет html form с атрибутами Alpine.js:

<div>
  <form id="form" action="/collection/create"
      x-data="formdata()"
      x-on:submit="submit($event)" >
    <div>
      <input x-model="fields.name.value"
        x-on:blur="validateField(fields.name)"
        name="name" type="text" />
      <p class="" x-cloak>
          <span x-text="fields.name.error"></span>
      </p>
    </div>
    <input type="submit" x-bind:disabled="isFormInvalid" />
  </form>
</div>

Данные AlpineJs задаются в форме. Ввод text и span сопоставляются соответственно со свойствами fields.name.value и fields.name.error объекта модель данных.

Событие отправки form сопоставляется с методом submit данных, а событие text input blur — с validateField данных. метод.

Атрибут ввода disabled для отправки сопоставляется со свойством данных isFormInvalid.

Вот модель данных AlpineJs, в которой используется IonideJs версии 8:

function formdata() {
    return {
        fields: {
            name: {
                value: null, error: null,
                rules: ["required", "minLength:2"]
            },
        },
        isFormInvalid: true,
        validateField(field) {
            let res = Iodine.assert(field.value, field.rules);
            field.error = res.valid ?
                null :
                res.error
                ;
            this.isFormValid();
        },
        isFormValid(){
            this.isFormInvalid = Object.values(this.fields).some(
                (field) => field.error
            );
            return ! this.isFormInvalid ;
        },
        submit(e) {
            var ok = this.isFormValid();
            if( ! ok )
                e.preventDefault();
            return ok ;
        }
    }
};

AlpineJs x-on:event.prevent не работает с условным выражением (обсуждение на github), поэтому мы используем событие submit.

Новый API IonideJs — это просто Iodine.assert(value, array of rules). Посмотрите в документации полный список правил валидации, включенных в Iodine.

Большое спасибо сообществу бесплатных кодеров за все эти замечательные инструменты, которые питают мою повседневную жизнь ❤