在Cakephp中,如果没有模型,如何执行表单验证?

在Cakephp中,如果没有模型,如何执行表单验证?,cakephp,Cakephp,我需要进行一些验证。我在应用程序中没有该模型 有人知道如何在没有模型的情况下进行验证吗? 你能用一个小样本或声明给我演示一下吗?老实说,我会创建一个模型只是为了验证。可以通过添加来创建不使用表的模型 var $useTable = false; 然后创建一个验证数组,其中包含要验证的每个字段的规则: var $validate = array('login' => 'alphaNumeric','email' => 'email','born' => 'date'); 然后

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

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

老实说,我会创建一个模型只是为了验证。可以通过添加来创建不使用表的模型

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
中的每个值,并用正则表达式验证它,或者使用
验证::[rule]()
之类的东西,比如:

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

我想我的第一个问题是:如果你没有模型……你在验证什么?通常,数据收集将用于填充模型。如果您使用的是替代数据存储库(文件、web服务等),那么模型仍然是访问和操作该数据的合适方式


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

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


首先,我没有模型课,然后看到了。现在我使用一个虚拟模型类将我的验证放在那里,因为控制器操作中的代码看起来非常整洁。

您可以在CakePHP中执行表单数据的验证,而无需创建model.php文件。很多时候我都需要这样做,而存储model.php文件只做验证,这是对模型设计模式的一种拙劣使用

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

验证的另一个问题是它依赖于模型别名。如果您有一个名为“Email”的模型,但没有表来执行验证,那么发布的表单也必须使用“Email”。如果表单使用与控制器不同的别名,则必须设置操作。很多额外的步骤只是为了验证。如果表单使用其他模型,则不能再次重复使用该模型

因此,这里是我的替代方法

在控制器的操作中,接收已发布的表单数据。您可以创建一个默认的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该模型不使用表

只要applications model文件夹中没有email.php文件,这种方法就可以工作。一旦在内存中创建了此模型。可以从内置的表单帮助中访问它。这意味着验证错误将正确传递给视图

下面是一个示例视图文件

<?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(); ?>

视图现在将使用表单帮助器呈现电子邮件模型中的验证错误。这是因为CakePHP类注册表已将电子邮件自动模型的副本保存在内存中,Form helper将访问该副本

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


这些方法在CakePHP 1.3中测试,类验证是对象的一个子类,模型类使用它根据其中指定的验证规则执行验证

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

@ThinkingMedia让我走上了正确的方向,而且
$model->save($this->data)
不幸地为我返回false,即使表单是有效的。我使用CakePHP2.3.9作为参考

结果表明,即使设置了
'table'=>false
参数,
save()
返回的
$success
也基于创建/更新/修改的行的
$count>0
。在我的无表情况下,这意味着
$count
0
,而
$success
false
。我最终将引用的答案与此混合,以使验证在没有模型文件的情况下正常工作:

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->validates($this->request->data) && empty($model->validationErrors))
       {
           // validation was successful, but no data was actually saved
       }
   }
}

很多东西不收集数据,但仍然可能从验证中受益:搜索字段、登录表单、过滤搜索……这不是答案,本可以作为问题的答案,为什么if(validation::email($somethingthattbeanemailaddress))在我这边不起作用?@PinoyStackOverflower if不起作用,你的意思是“找不到类‘Validation’”然后您可能需要添加App::uses(‘Validation’、‘Utility’)来包含验证类。同样在CakePHP 2.4.4中进行了测试。答案非常棒!这对我非常有帮助。或者,您可以使用
$model->set($this->request->data);如果($model->validates()){//成功验证}
。看到了吗,这是可行的,但是有输入错误,应该是:if($model->validates($This->request->data)