【问题标题】:How do I simplify Form Processing in PHP?如何简化 PHP 中的表单处理?
【发布时间】:2010-10-18 22:10:26
【问题描述】:

我已经成为一名 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');
        }
    }
}

?>

如您所见,这应该是一个简单的联系表单,但它需要我的生命来验证它,我一直在研究一些设计模式(观察者,工厂),但我不相信如果和我应该以什么方式实现它们。

【问题讨论】:

  • 如果你觉得有时间,你可以看看Django是怎么做的!

标签: php validation forms


【解决方案1】:

您可以为所有表单创建一个抽象基类,为字段类型创建一个类,以及一个仅用于验证各种类型的值的静态类(validateString、validateHtml、validateEmail、validateNumber、date 等,只是方法......) .定义您的表单,您将定义它将使用哪些字段对象,因此 Form->validate() 方法将调用 Field->validate() 并返回过滤后的值或错误消息。为字段指定默认错误消息,但在表单类中定义字段时提供覆盖它的选项。

哦,别管那个 $_POST 了。阅读帖子一次,将其传递给表单验证,然后处理过滤的字段值。

另一件事是,根据您的需求和应用程序的架构,有多种方法可以实现表单验证,当您有多种方法来设计应用程序时,很难制作一个通用的表单验证器。选择一种工作方式并坚持下去(无论它是一个现成的框架还是您自己的代码),或者您编写的任何超级重复表单验证,在以后的项目中都没有意义。

还有一个:像 Django?好的!所以开始用 Django 编写 Python,你会真正改变完成工作的思维方式。

【讨论】:

  • JZ,我喜欢你的想法,你能详细说明一下吗?具体来说,这个 Form 对象是否与用于显示和验证表单的对象相同?我怎样才能完成多个替代验证,如上面的 $_POST['contact'] 字段?谢谢。
  • 是的,一个渲染表单并验证它的模块。这就是为什么我提到这个事实,这在很大程度上取决于您的整个应用程序的设计,您将 MVC 模式实现为上述 troelskn 的方式等。但是,只有当您想要的时候,您才能为验证数据创建一个类。
  • [继续] 我只是不认为制作一个仅验证类会让你更接近你在问题中提到的 django 方式,那里的验证非常甜蜜,因为它是整个井的一部分设计表单处理。
【解决方案2】:

恕我直言,将表单视为单一概念的尝试是失败的。如果您的应用程序有任何类型的分层架构,那么表单很可能会跨越这些架构。表单具有应用逻辑(控制器层),它们具有可视化表示(视图层),它们具有状态(应用层模型),最后它们通常会调用某种事务脚本(模型层)。

我认为你最好放弃将“表单”作为一个实体的想法,而是将三个部分(输入处理、渲染和模型层)作为完全独立的事情来关注,这可能会(也可能不会) ) 恰好彼此密切相关。这有时被称为 MVC 模式,尽管这个词现在已经被广泛使用,它可能意味着很多东西。

【讨论】:

    【解决方案3】:

    我知道这是你排除的东西,我也和你一样,直到一年前,当我强迫自己学习像 Qcodo(php 框架)这样的晦涩难懂的东西时,你瞧,我什么也做不了现在没有它。从你的肩膀上卸下许多总是重复的负担真是太好了。 为什么选择 Qcodo?当时我想学习最高级的,因为我已经在学习了,所以我寻找了 Qcodo 似乎提供的最广泛的功能集。今天我不知道哪个最火,但对我来说 Qcodo 仍然满足我的所有需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 2021-12-05
      • 1970-01-01
      相关资源
      最近更新 更多