gpt4 book ai didi

php - 锂和验证复杂形式的输入 - 如何?

转载 作者:可可西里 更新时间:2023-11-01 12:37:45 25 4
gpt4 key购买 nike

我已经完成了很多 Lithium 教程(下面的链接,以防他们帮助其他人,并表明我已经完成了我的家庭作业:)并且我了解创建模型、 View 、 Controller 和使用 MVC 来创建的最基本部分基于表单输入的数据库记录。

但是,我是 webapps 和 Lithium 的 MVC 新手,我不确定在更复杂的情况下应该如何编写代码。这是一个一般性问题,但我有两个具体的验证问题:

  • 我应该如何验证从表单提交的日期数据?
  • 我应该如何检查两个用户电子邮件字段是否具有相同的值?

  • 对于这些问题的任何帮助,我将不胜感激,像这样的具体示例也将真正帮助我理解如何在其他情况下进行良好的 MVC 编码!

    日期输入 - 验证跨多个表单输入拆分的数据

    出于 UI 原因,注册表单要求用户在三个字段中输入他们的 DOB:
    <?=$this->form->field('birthday', array('type' => 'select', 'list' => array(/*...*/))); ?>
    <?=$this->form->field('birthmonth', array('type' => 'select', 'list' => array(/*...*/))); ?>
    <?=$this->form->field('birthyear', array('type' => 'select', 'list' => array(/*...*/))); ?>

    验证此服务器端的最佳方法是什么?我认为我应该利用 automagic 验证,但我不确定对一组实际上不是模型一部分的变量进行此操作的最佳方法。例如。:
  • 我应该对 $this->request->data 进行后处理吗?在 UsersController ?例如。修改 $this->request->dataUsersController在将其传递给 Users::create 之前.
  • 我应该从 $this->request->data 中取出表单域吗?并使用静态调用 Validator::isDateUsersController ?
  • 有没有办法在模型中为不属于模型的表单变量组合编写验证规则?
  • 我应该覆盖 Users::create并在那里进行所有额外的验证和后处理?

  • 所有这些看起来都可以工作,尽管有些看起来有点难看,我不知道哪些会在 future 给我带来重大问题。

    [编辑:与此密切相关的是将三个表单字段合并为一个字段以保存在模型中的问题]

    电子邮件条目 - 检查两个表单字段是否相同,但只存储一个

    对于常识/惯例,注册表要求用户两次指定他们的电子邮件地址:
    <?=$this->form->field('email_address'); ?>
    <?=$this->form->field('verify_email_address'); ?>

    我如何编写一个自动验证规则来检查这两个表单字段是否具有相同的值,但只将 email_address 保存到数据库中?

    感觉这与上面的问题几乎相同,因为我能想到的可能答案列表是相同的 - 所以我将此作为一个问题提交,但我非常感谢您对这两部分的帮助,因为我认为这个问题的解决方案将是微妙的、不同的并且同样具有启发性!

    [编辑:与此密切相关的是未将 verify_email_address 存储到我的模型和数据库中的问题]

    关于锂的一些背景阅读

    我读过其他人,但是这三个教程让我了解了我现在与用户和注册表格的关系......
  • Blog tutorial
  • Extended blog tutorial
  • MySQL blog tutorial

  • 关于密切相关主题的其他一些 StackOverflow 问题(但不回答它,也不是特定于锂的)
  • this question的一个答案建议创建一个单独的 Controller (和模型和......?) - 我觉得它不是很“锂”,我担心它也可能很脆弱/容易出错
  • This wonderful story说服我我担心将它放入 Controller 是正确的,但我不确定什么是好的解决方案
  • This one on views让我觉得我应该以某种方式将它放入模型中,但我不知道在 Lithium 中执行此操作的最佳方法(请参阅上面日期条目下的项目符号列表)
  • this Scribd 演示文稿问了我希望在最后一页上回答的问题......因此它没有回答就停止了!

  • 注意:CakePHP 风格的答案也很好。我不知道,但它很相似,如果需要,我相信我可以翻译它!

    最佳答案

    我建议在 Model 中执行此操作而不是 Controller - 这样无论你从哪里进行保存,它都会发生。

    对于日期字段问题,在您的模型中,覆盖 save()方法和处理在调用 parent::save 之前将数据中的多个字段转换为一个日期字段做实际的储蓄。任何高级操作都可以在那里进行。

    您的评论中描述的使用隐藏表单字段获取错误消息以显示的技术听起来不错。

    为了比较两个电子邮件字段是否相等,我建议定义一个自定义验证器。您可以使用 Validator::add 在 bootstrap 中执行此操作.

    use lithium\util\Validator;
    use InvalidArgumentException;

    Validator::add('match', function($value, $format = null, array $options = array()) {
    $options += array(
    'against' => '',
    'values' => array()
    );
    extract($options);
    if (array_key_exists($against, $values)) {
    return $values[$against] == $value;
    }
    return false;
    });

    然后在你的模型中:
    public $validates = array(
    "email" => array(
    "match",
    "message" => "Please re-type your email address.",
    "against" => "email2"
    )
    );

    编辑 :根据评论,这是一种在 Controller 中进行自定义规则验证的方法:
    public function save() {
    $entity = MyModel::create($this->request->data);
    $rules = array(
    "email" => array(
    "match",
    "message" => "Please re-type your email address.",
    "against" => "email2"
    )
    );

    if (!$entity->validates($rules)) {
    return compact('entity');
    }

    // if your model defines a `$_schema` and sets `$_meta = array('locked' => true)`
    // then any fields not in the schema will not be saved to the db

    // here's another way using the `'whitelist'` param
    $blacklist = array('email2', 'some', 'other', 'fields');
    $whitelist = array_keys($entity->data());
    $whitelist = array_diff($whitelist, $blacklist);

    if ($entity->save(null, compact('whitelist'))) {
    $this->redirect(
    array("Controller::view", "args" => array($entity->_id)),
    array('exit' => true)
    );
    }

    return compact('entity');
    }

    将数据设置为实体的一个优点是,如果出现验证错误,它会自动预填充到您的表单中。

    关于php - 锂和验证复杂形式的输入 - 如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9932325/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com