2009-11-28 132 views
2

我正在编写一个自定义验证程序,用于检查是否存在电子邮件,以便如果它已存在于数据库中,表单无效。我很难找出自定义Zend_Validation类的助手路径和命名空间。zend框架自定义验证类

我想调用类My_Validate_EmailUnique但我不断收到错误消息,例如: 有一个错误例外“Zend_Loader_PluginLoader_Exception”有消息“插件的名字‘My_Validate_EmailUnique’在注册表中未找到;使用的路径:My_Validate_:在/ var/WWW /网站/ ARC /助理/

类看起来是这样的:

<?php 
class My_Validate_EmailUnique extends Zend_Validate_Abstract 
{ 
    const EMAIL_UNIQUE = 'notMatch'; 

有人可以帮助我,我注册了Zend_Form的寻找自定义验证?

+0

你有没有在/ var /网络/网站/ ARC /佣工文件EmailUnique.php /和你看了Db_NoRecordExists验证?我认为它符合你的需求:http://framework.zend.com/manual/en/zend.validate.set.html#zend.validate.Db – 2009-11-28 00:22:07

+0

也许,我错过了Zend_Loader实际上是如何做的(或者更可能Zend_Loader_PluginLoader我有一个文件有,我有我的窗体的构造函数中执行以下操作: $的电子邮件 - > addPrefixPath(“My_Validate”,APPLICATION_PATH“/助理/”,“验证”); 。是否Zend_Loader_PluginLoader使用不同的逻辑不是那么Zend_Loader其中My_Validate_ *会去我的/验证。 这听起来像Db_NoRecordExists可能工作,但说实话,我想弄清楚这是怎么工作的。 感谢大卫 – timpone 2009-11-28 00:41:38

回答

5

您可以直接将验证器添加到您的表单元素。没有必要为此编写自定义验证程序。

在您的形式:



$element->addValidator(new Zend_Validate_Db_NoRecordExists('mytablename', 'myemailcolumnname')); 
+1

如果您想要定义要使用哪个'Zend_Db_Adapter',第四个参数很有用。 – chelmertz 2009-11-30 17:30:35

2

+1对于Db_NoRecordExists - 文档有一个示例,显示您想要执行的操作。

否则,自定义验证器可以像常规库类一样加载,因此请尝试将它放在包含路径中。

/library/My/Validate/EmailUnique.php


您还可以添加新条目到Zend_Application_Module_Autoloader,如果你想保持它在你的应用程序文件夹,而不是你的库:

// Bootstrap.php 
protected function _initAutoloader() 
{ 
    $autoloader = new Zend_Application_Module_Autoloader(array(
     'namespace' => 'My_', 
     'basePath' => dirname(__FILE__), 
    )); 

    $autoloader->addResourceType('validator', 'validators', 'Validate') 

    return $autoloader; 
} 

并把阶级My_Validate_EmailUnique in:

/application/validators/EmailUnique.php

我从来没有注册一个自定义的验证器作为插件之前,所以我不能帮你在那里抱歉。

+0

在Db_NoRecordExists方面,你如何关闭它之间的关系插入和更新。我使用相同的操作(manageAction),并且在更新时,我不希望它被验证。看起来我可能会做一个removeValidator,但理想情况下,我想这样做不是在控制器,而是在模型(或可能的服务)。任何建议,如果这是正确的方法。 – timpone 2010-01-14 03:12:11