Как мне упростить обработку форм в PHP? - PullRequest
8 голосов
/ 11 апреля 2009

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

Я знаю, что большинство фреймворков PHP в настоящее время облегчают эту работу, но почему-то мне не хочется переносить весь мой код на одну из этих фреймворков, и я не совсем понимаю, как проверка формы реализована в Django для экземпляр (я знаю, это Python, но мне очень нравится их подход), так что я бы лучше разместил здесь способ обработки простой формы, и, возможно, вы, ребята, можете указать мне лучшее направление.

<?php

// sample controller
class _sample extends framework
{
    // sample action
    function contact()
    {
        if ($this->Is->Post() === true)
        {
            $errors = array();

            if ($this->Is->Set($_POST['name']) === false)
            {
                $errors['name'] = 'Please fill in your name.';
            }

            if (($this->Is->Email($_POST['email']) === false) || ($this->Is->Set($_POST['email']) === false))
            {
                $errors['email'] = 'Please fill in your email address.';
            }

            if (($this->Is->Phone($_POST['contact']) === false) && ($this->Is->Mobile($_POST['contact']) === false))
            {
                $errors['contact'] = 'Please fill in your phone (or cell phone) number.';
            }

            if ($this->Is->Set($_POST['message']) === false)
            {
                $errors['message'] = 'Please type a message';
            }

            // no errors, it's valid!
            if (empty($errors) === true)
            {
                // do stuff and redirect to "success" / "thank you" page
            }

            // load the form view, and let it display the errors
            // automatically prefill fields with $_POST values
            else
            {
                $this->View('contact_form', $errors);
            }
        }

        // load the form view for the first time
        else
        {
            $this->View('contact_form');
        }
    }
}

?>

Как вы можете видеть, это должна быть простая контактная форма, однако у меня отнимает жизнь, чтобы проверить ее, я изучал некоторые шаблоны проектирования (Observer, Factory), но я не чувствую уверенности, если и каким образом я должен их реализовать.

Ответы [ 3 ]

4 голосов
/ 11 апреля 2009

ИМХО, попытка трактовать форму как единое понятие провалилась. Если у вас есть какая-либо многоуровневая архитектура для вашего приложения, формы, скорее всего, пересекают их. Формы имеют логику приложения (уровень контроллера), они имеют визуальное представление (уровень представления), они имеют состояние (модель уровня приложения) и, в конце концов, они обычно вызывают некоторый сценарий транзакции (уровень модели).

Я думаю, что вам гораздо лучше отказаться от идеи "формы" как сущности, и вместо этого сосредоточиться на трех частях (обработка ввода, рендеринг и слой модели) как на совершенно разных вопросах, которые могут (или не могут) б) тесно связаны друг с другом. Это иногда называют паттерном MVC, хотя этот термин уже настолько загружен, что может означать много вещей.

1 голос
/ 11 апреля 2009

Вы можете создать абстрактный базовый класс для всех ваших форм, классы для типов полей и статический класс только для проверки значений различных типов (validateString, validateHtml, validateEmail, validateNumber, date и т. Д., Только методы ...) , Определяя форму, вы определяете, какие объекты полей она будет использовать, поэтому метод Form-> validate () вызовет Field-> validate () и вернет отфильтрованное значение или сообщение об ошибке. Укажите сообщения об ошибках по умолчанию для полей, но дайте возможность переопределить их при определении полей в классе формы.

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

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

Еще один: как Джанго? Хорошо! Так что начните программировать Python на Django, вы действительно измените способ мышления, как выполнить свою работу.

1 голос
/ 11 апреля 2009

Я знаю, что это то, что вы исключили, и я тоже был похож на вас, пока год назад, когда я заставил себя научиться чему-то неясному, как Qcodo (php framework), и вот, я могу ничего не делать без этого в наши дни. Просто замечательно снять с плеч много постоянно повторяющегося бремени. Почему Qcodo? В то время я хотел изучить самый продвинутый, так как я уже учусь, поэтому я искал самый широкий набор функций, который, казалось, предлагал Qcodo. Сегодня я не знаю, какой из них самый горячий, но для меня Qcodo все еще выполняет все мои потребности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...