我需要进行一些验证。我在应用程序中没有该模型。
有没有人知道如何在没有模型的情况下进行验证? 你能用一个小样本或陈述给我看看吗?
答案 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
和$success
为false
。我最终将引用的答案与此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服务等),则模型仍然是访问和操作该数据的适当方式。
简而言之,为了更好地回答这个问题,我认为更多的背景会有所帮助,甚至可能是必要的。