Как правильно написать форму в Laravel или других фреймворках? - PullRequest
0 голосов
/ 23 января 2019

Я довольно новичок в Laravel, но я уже читал о проверке и Laravel Collective .Я считаю, что эти методы довольно громоздки, потому что проверка происходит на разных уровнях:

  • Проверка в базе данных (ограничение внешнего ключа, типы столбцов)
  • Проверка в модели (черезset...Attribute методы)
  • Проверка по признаку запроса
  • Проверка по внешнему интерфейсу (например, Bootstrap )

Например, Iхотел бы написать форму с селектором страны.В моей базе данных есть столбец VARCHAR(2) для получения кода страны.Я должен написать метод setCountryAttribute в моей модели, чтобы сравнить его с принятыми странами.Затем я должен написать запрос формы php artisan make:request StoreCustomerPost, который является частичной копией кода setCountryAttribute.В конце концов мне нужно написать немного JavaScript для проверки на стороне клиента.

Делать это для каждой области каждой формы большого приложения просто недопустимо.

То, что я ищу, - это более оптимизированное решение, которое включает в себя метапрограммирование.Например, я могу использовать фабрику наборов инструментов, которая может генерировать весь внешний HTML, включая код проверки JS, проверку запроса и проверку модели.

Давайте рассмотрим пример поля формы age.Я думаю, что это можно определить следующим образом:

"age": {
    "type": "textfield",
    "name": "age",
    "validation": {
        "type": "integer"        
        "pattern": "/\d{1,2}|1\d{2}/",
        "minValue": 0,
        "maxValue": 122,
    },
    "view": {
        "template": "form.fields.textfield",    
        "placeholder": "Age",
        "size": "10em",
        "title": "Age",
        "validation": true
    }
}

Этой информации достаточно для динамического генерирования:

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

Так что в моем контроллере я ожидаю что-то вроде:

public function edit($id) {
    $form = Form::fill(Customer::find($id))
        ->field('age');
        ->field('firstname');
        ->field('lastname');

    return view('customers.edit', ['form' => $form->toBlade()]);
}

Есть ли решение, достаточно близкое к этому предложению?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Сначала несколько мыслей:

  • не все функции PHP, используемые при проверке, имеют аналог в Javascript и наоборот. Даже регулярные выражения не ведут себя одинаково на обоих языках.Проверьте regex101 на тонкие различия.

  • Вы можете просто использовать вызовы xhr (ajax) для проверки правильности laravel, однако я согласен, что лучше всего предотвращать ненужные вызовы на сервер с проверкой клиента.

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

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

0 голосов
/ 24 января 2019

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

Я чувствую вашу боль :-) Хотя вопрос немного широк, потому что на него нелегко ответить, если где-то есть 1006 * такой инструмент, который вы описываете. По крайней мере, я могу сказать, я никогда не видел и не слышал ни одного для Laravel.

До того, как я использовал Laravel, я работал над большим проектом с MeteorJS, и у них есть потрясающий пакет Collection 2 , который мне очень не хватает в Laravel. Но я думаю, что легче справиться, если вам нужно иметь дело только с одним языком для бэкэнда и внешнего интерфейса, чем с двумя.

Так что я бы сказал, что вы должны сделать все это самостоятельно, но с нетерпением ждем вас, если кто-то придумает какой-нибудь скрытый драгоценный камень: -)

...