Как правильно написать форму в Laravel или других фреймворках?

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

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

Например, я хотел бы написать форму с выбором страны. В моей базе данных есть столбец 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()]);
}

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

Это интересная и распространенная проблема. Меня тоже раздражает, что у каждой библиотеки есть собственный код проверки. Вы можете создать общий класс, который проверяет этот объект и использовать его в js, моделях и так далее. например: пользовательский класс имеет свойство $validations = ... и проверку метода. Вы можете передать этот общий объект всем классам и сгенерировать код javascript на их основе. Я не знаю, есть ли библиотека для проверки js точно. Вы можете создать свой собственный или использовать существующий, но, возможно, адаптируете свои правила в соответствии со структурой правил библиотеки js.

user2693928 23.01.2019 19:14

Это все? github.com/kristijanhusak/laravel-форм-билдер

Brainmaniac 24.01.2019 00:12
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
93
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

What I am looking for is a more optimized solution which involves meta-programming. For instance, I may use a toolbox factory that can generate all the fronend HTML including the JS validation code, the Request validation, and the Model validation.

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

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

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

Ответ принят как подходящий

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

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

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

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

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

Другие вопросы по теме