Задать вопрос
Expany
@Expany
$this->get('skill');

Возможно ли написать универсальный обработчик форм?

Возможно ли написать универсальный(быть может более уместно сказать - абстрактный) обработчик форм на php?
В ситуации, когда предварительно не известно конечное кол-во полей формы, на пример, что бы один и тот же обработчик справлялся с формой которую сделал я, например на 3 поля и в тот же момент, полностью обработал бы форму Васи на 12 полей.

Я в тупике, все размышления сошлись на мысли о том что обработчик должен получать массив полей формы и уже разбирать массив, так ли это, и не окажется ли это излишним?
  • Вопрос задан
  • 255 просмотров
Подписаться 2 Оценить 1 комментарий
Решения вопроса 1
ksider
@ksider
Я сварщик не настоящий
а если перебрать foreach массив $_POST?
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
customtema
@customtema
arint.ru
Можно. Подход работает.

Предупреждаю - работы надолго.
Ответ написан
Комментировать
index0h
@index0h
PHP, Golang. https://github.com/index0h
Это бессмысленно. Чем универсальнее будет ваш обработчик - тем сложнее будет им пользоваться. Что произойдет, когда данные будут отправляться в виде json например, а не url-кодированной строки?

Вместо этого рекомендую следующий подход

use Symfony\Component\HttpFoundation\Request;

class LoginForm
{
    /** @var string */
    private $login;
    /** @var string */
    private $password;

    /**
     * @param Request $request
     */
    public function __construct(Request $request)
    {
        $login    = $request->request->get('login');
        $password = $request->request->get('password');

        if (is_null($login)) {
            throw new \InvalidArgumentException('Parameter "login" is required');
        } elseif (!is_string($login)) {
            throw new \InvalidArgumentException('Parameter "login" must be string');
        } elseif (strlen($login) < 3) {
            throw new \InvalidArgumentException('Length of parameter "login" must be greater than 3');
        } elseif (strlen($login) > 64) {
            throw new \InvalidArgumentException('Length of parameter "login" must be less than 64');
        } elseif (preg_match('/^[a-z\d]+$/i', $login) === 0) {
            throw new \InvalidArgumentException('Parameter "login" contain not allowed symbols');
        }

        if (is_null($password)) {
            throw new \InvalidArgumentException('Parameter "password" is required');
        } elseif (!is_string($password)) {
            throw new \InvalidArgumentException('Parameter "password" must be string');
        } elseif (strlen($password) < 6) {
            throw new \InvalidArgumentException('Length of parameter "password" must be greater than 6');
        }

        $this->login    = $login;
        $this->password = $password;
    }

    /**
     * @return string
     */
    public function getLogin(): string
    {
        return $this->login;
    }

    /**
     * @return string
     */
    public function getPassword(): string
    {
        return $this->password;
    }
}


Да, кода получается много, но вы гарантировано получаете корректные данные с помощью геттеров. Если нужно будет создавать некие DTO, или VO - прямо в конструкторе это можно сделать. Такой класс прост в тестировании и поддержке.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы