如何在Cakephp中没有模型的情况下执行表单验证?

时间:2009-07-20 15:59:07

标签: cakephp

我需要进行一些验证。我在应用程序中没有该模型。

有没有人知道如何在没有模型的情况下进行验证? 你能用一个小样本或陈述给我看看吗?

6 个答案:

答案 0 :(得分:35)

老实说,我会为验证创建一个模型。您可以通过添加

来创建不使用表的模型
var $useTable = false;

然后创建一个验证数组,其中包含要验证的每个字段的规则:

var $validate = array('login' => 'alphaNumeric','email' => 'email','born' => 'date');

然后,在您的控制器中,执行以下操作:

$this->MyModel->set($this->data);
if($this->MyModel->validates()){
    // do stuff with valid data
}

如果你真的,真的不能使用模型,那么你必须简单地循环控制器动作中$this->data中的每个值并根据正则表达式对其进行验证或使用Validation::[rule]()内容,例如:

if(Validation::email($someThingThatMightBeAnEmailAddress)){
    // do stuff with valid email address.
}

答案 1 :(得分:9)

您可以在CakePHP中执行表单数据验证,而无需创建model.php文件。有很多次我需要这样做,并且存储model.php文件,这些文件除了验证之外什么都不做,这是对模型设计模式的不良使用。

CakePHP的另一个问题是,有时验证规则在多个模型中很常见。将验证移出模型会很好,就像行为对自己的子文件夹一样。这样我们就可以重复使用它们,或者在没有模型的情况下使用它们。

验证的另一个问题是它依赖于模型别名。如果您有一个名为“电子邮件”的模型而没有表格来执行验证,那么发布的表单也必须使用“电子邮件”。如果表单使用与控制器不同的别名,则必须设置操作。许多额外的步骤只是为了进行验证。如果表单使用不同的模型,则无法再次使用该模型。

所以这是我的替代方法。

在控制器的操作中,接收已发布的表单数据。您可以创建默认的CakePHP模型,添加一些验证规则,然后使用该模型进行验证。

示例操作可能如下所示;

function edit()
{
   $model = ClassRegistry::init(array('class'=>'Email','table'=>false,'type'=>'Model'));
   if(!empty($this->data))
   {
       $model->validate = array(
           'subject'=>array(
               'rule'=>'notEmpty',
               'required'=>true
           ),
           'message'=>array(
               'rule'=>'notEmpty',
               'required'=>true
           )
       );
       if($model->save($this->data))
       {
           // validation was successful, but no data was actually saved
       }
   }
}

这里的关键是CakePHP创建一个自动模型。

       $model = ClassRegistry::init(array('class'=>'Email','table'=>false,'type'=>'Model'));

以上尝试在应用程序模型文件夹中通过电子邮件查找模型。如果没有找到,CakePHP将自动为该类创建内存模型。由于我们将'table'的值设置为false,因此这应该告诉CakePHP该模型不使用表。

只要应用程序模型文件夹中确实没有email.php文件,这就可以正常工作。一旦在内存中创建此模型。它可以从内置的Form帮助中访问。这意味着验证错误将正确传递给视图。

以下是一个示例视图文件。

<?php echo $this->Form->create('Email',array('action'=>array('controller'=>'mycontroller','action'=>'edit'))); ?>
<?php echo $this->Form->input('subject'); ?>
<?php echo $this->Form->input('message',array('type'=>'textarea')); ?>
<?php echo $this->Form->submit(); ?>

视图现在将使用Form帮助程序从Email模型呈现验证错误。这是因为CakePHP类注册表已将内存中的EMail自动模型的副本保存在Form帮助程序中。

如果要使用自定义验证规则,则必须将回调方法放在app_model.php文件中。

在CakePHP 1.3中测试了这些方法

答案 2 :(得分:1)

遇到这个问题,因为我也有类似的问题。我有一个需要收集数据并生成PDF的表单。因此,不存在数据保存,也没有加工模型类。 PDF是用户合同,用户将填写在线表格,填写的数据将用于生成必须打印和回邮的PDF。但我需要验证字段是否为空,电子邮件是否真的是电子邮件格式,日期输入实际上是日期输入。

首先,我没有模型类,然后看到this quesion。现在我正在使用一个虚拟模型类来验证我的验证,因为控制器操作中的代码看起来很整洁。

答案 3 :(得分:1)

@ ThinkingMedia的answer让我朝着正确的方向前进,但不幸的是$model->save($this-data)对我来说是假的,即使表格有效。我正在使用CakePHP 2.3.9作为参考。

事实证明,即使设置了'table'=>false参数,$success的返回save()也基于已创建/更新/修改的$count > 0行。在我的无表格案例中,$count 0$successfalse。我最终将引用的答案与此similar question's solution混合,以使验证在没有模型文件的情况下正常工作:

function edit()
{
   $model = ClassRegistry::init(array('class'=>'YourFormName','table'=>false,'type'=>'Model'));
   if($this->request-is('post'))
   {
       $model->validate = array(
           'some_field'=>array(
               'rule'=>'notEmpty',
               'required'=>true
           ),
           'another_field'=>array(
               'rule'=>'notEmpty',
               'required'=>true
           )
       );
       $model->set($this->request->data)
       if($model->validate($this->request->data) && empty($model->validationErrors))
       {
           // validation was successful, but no data was actually saved
       }
   }
}

答案 4 :(得分:0)

类验证是类的子类,模型类使用它来对其中指定的验证规则进行验证。

可以直接在任何控制器或模型中实例化Validation类,并使用其方法对任何数据执行验证,而不仅仅是来自表单的输入。

答案 5 :(得分:-3)

我认为我的第一个问题是:如果你没有模型......你在验证什么?通常,将进行数据收集以填充模型。如果您正在使用备用数据存储库(文件,Web服务等),则模型仍然是访问和操作该数据的适当方式。

简而言之,为了更好地回答这个问题,我认为更多的背景会有所帮助,甚至可能是必要的。