2012-12-14 94 views
3

我想通過特殊驗證事件驗證數據完整性。我的Phalcon \ Mvc \ Collection模型用一些Phalcon \ Mvc \ Model \ Validator驗證器實現了validation()方法。在我的控制器中,我保存()該模型。如果保存操作失敗,我嘗試通過模型的getMessages()方法輸出錯誤消息。換句話說,我遵循文檔中提供的示例http://docs.phalconphp.com/en/latest/reference/odm.htmlPhalcon ODM驗證消息

但是,我得到getMessages()方法不存在的錯誤。我的Phalcon版本是0.7.0。我檢查了API http://docs.phalconphp.com/en/latest/api/Phalcon_Mvc_Collection.html,並沒有顯示getMessages()方法。我還對Phalcon \ Mvc \ Collection課程進行了反思測試,並確認了觀察結果。

該文檔還指出我們可以使用Phalcon \ Mvc \ Collection \ Validator實現我們自己的驗證器。但是,這個類似乎不存在。

所以,我的問題是:

  1. 我如何證明是一個確認的結果的錯誤信息?
  2. 如何創建自定義驗證器?
  3. 是否是Phalcon \ Mvc \ Model \ Validator \唯一性驗證程序NOSQL是否兼容?

謝謝你的時間。

回答

8

你說得對,實現中缺少getMessages()方法。現在,你可以把它添加到你的模型,而它的正式加入到C級:

<?php 

class Users extends Phalcon\Mvc\Collection 
{ 
    public function getMessages() 
    { 
     return $this->_errorMessages; 
    } 
} 

1 - 我如何證明是一個確認的結果的錯誤信息?以上檢查

2-如何創建自定義驗證器?

驗證器是由「費爾康\的mvc \型號\驗證」繼承並實現「爾康\的mvc \型號\ ValidatorInterface」一類:

<?php 

use Phalcon\Mvc\Model\Validator, 
Phalcon\Mvc\Model\ValidatorInterface; 

class HashValidator extends Validator implements ValidatorInterface 
{ 

    public function validate($record) 
    { 
     $fieldName = $this->getOption('field'); 
     if (!preg_match('/[a-z]+/', $fieldName) {   
      $this->appendMessage("The hash is not valid", $fieldName, "Hash"); 
      return false; 
     } 
     return true; 
    } 

} 

如果你不想重複使用驗證器你可以簡單地添加驗證規則到模型:

<?php 

use Phalcon\Mvc\Model\Message; 

class Users extends Phalcon\Mvc\Collection 
{ 

    public function validation() 
    { 
     if (!preg_match('/[a-z]+/', $this->password) {   
      $this->_errorMessages[] = new Message("The hash is not valid", "password", "Hash"); 
      return false; 
     } 
     return true; 
    } 

    public function getMessages() 
    { 
     return $this->_errorMessages; 
    } 

} 

3-是爾康\的mvc \型號\驗證\唯一性驗證NOSQL兼容? 這個驗證只與SQL型號兼容,但是,你可以創建一個驗證與NoSQL的集合,以這種方式工作:

<?php 

use Phalcon\Mvc\Model\Validator, 
Phalcon\Mvc\Model\ValidatorInterface; 

class UniqueValidator extends Validator implements ValidatorInterface 
{ 

    public function validate($record) 
    { 
     $field = $this->getOption('field'); 
     if ($record->count(array("field" => $record->readAttribute($field)))) { 
      $this->appendMessage("The ".$field." must be unique", $fieldName, "Unique"); 
      return false; 
     } 
     return true; 
    } 

} 
+0

謝謝你的詳細答案。 – lobostome

0

twistedxtra的驗證程序的修正版本:

<?php 
use Phalcon\Mvc\Model\Validator, 
    Phalcon\Mvc\Model\ValidatorInterface; 

class UniqueValidator extends Validator implements ValidatorInterface 
{ 
    public function validate($record) 
    { 
     $field = $this->getOption('field'); 
     if ($record->count(['conditions'=>[$field => $record->readAttribute($field)]])) { 
      $this->appendMessage("The " . $field . " must be unique", $field, "Unique"); 
      return false; 
     } 
     return true; 
    } 
} 
1

我跑成驗證器在更新文檔時失敗。該領域確實存在,但它存在於我正在更新的文檔中。 更新時,將檢查是否有其他文檔具有相同的值。

<?php 

use MongoId, 
    MongoRegex, 
    Phalcon\Mvc\Model\Validator, 
    Phalcon\Mvc\Model\ValidatorInterface; 

class UniqueValidator extends Validator implements ValidatorInterface 
{ 
    public function validate($record) 
    { 
     $idValue = $record->readAttribute('_id'); 
     $field = $this->getOption('field'); 
     $fieldValue = $record->readAttribute($field); 

     $conditions = array($field => $fieldValue)); 
     if(isset($idValue)) 
     { 
      $conditions['_id'] = array('$ne' => $idValue); 
     } 

     if($record->count(array('conditions' => $conditions))) 
     { 
      $this->appendMessage("The " . $field . " must be unique", $field, "Unique"); 
      return FALSE; 
     } 
     else 
      return TRUE; 
    } 
} 
+0

不錯,這對更新記錄很有效 – Ajibola