Validators updated, *NOTE* this breaks BC:
- validators codes are now string instead of integers (constants) - validating is now handled in record level - added new component Doctrine_Validator_ErrorStack - new methods Doctrine_Record::isValid() and Doctrine_Record::getErrorStack() - errorStack now as a record instance variable
This commit is contained in:
parent
847bd1ade6
commit
67da38b07d
@ -535,18 +535,18 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun
|
|||||||
$record->loadReference($alias);
|
$record->loadReference($alias);
|
||||||
}
|
}
|
||||||
|
|
||||||
$r = Doctrine_Relation::getDeleteOperations($this->originals[$alias],$new);
|
$operations = Doctrine_Relation::getDeleteOperations($this->originals[$alias],$new);
|
||||||
|
|
||||||
foreach($r as $record) {
|
foreach($operations as $r) {
|
||||||
$query = "DELETE FROM ".$asf->getTableName()." WHERE ".$fk->getForeign()." = ?"
|
$query = "DELETE FROM ".$asf->getTableName()." WHERE ".$fk->getForeign()." = ?"
|
||||||
." AND ".$fk->getLocal()." = ?";
|
." AND ".$fk->getLocal()." = ?";
|
||||||
$this->table->getConnection()->execute($query, array($record->getIncremented(),$this->getIncremented()));
|
$this->table->getConnection()->execute($query, array($r->getIncremented(),$record->getIncremented()));
|
||||||
}
|
}
|
||||||
|
|
||||||
$r = Doctrine_Relation::getInsertOperations($this->originals[$alias],$new);
|
$operations = Doctrine_Relation::getInsertOperations($this->originals[$alias],$new);
|
||||||
foreach($r as $record) {
|
foreach($operations as $r) {
|
||||||
$reldao = $asf->create();
|
$reldao = $asf->create();
|
||||||
$reldao->set($fk->getForeign(),$record);
|
$reldao->set($fk->getForeign(),$r);
|
||||||
$reldao->set($fk->getLocal(),$this);
|
$reldao->set($fk->getLocal(),$this);
|
||||||
$reldao->save();
|
$reldao->save();
|
||||||
|
|
||||||
@ -569,15 +569,15 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun
|
|||||||
$new = $this->references[$alias];
|
$new = $this->references[$alias];
|
||||||
|
|
||||||
if( ! isset($this->originals[$alias]))
|
if( ! isset($this->originals[$alias]))
|
||||||
$this->loadReference($alias);
|
$record->loadReference($alias);
|
||||||
|
|
||||||
$r = Doctrine_Relation::getDeleteOperations($this->originals[$alias], $new);
|
$operations = Doctrine_Relation::getDeleteOperations($this->originals[$alias], $new);
|
||||||
|
|
||||||
foreach($r as $record) {
|
foreach($operations as $r) {
|
||||||
$record->delete();
|
$r->delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->originals[$alias] = clone $this->references[$alias];
|
$record->assignOriginals($alias, clone $this->references[$alias]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
endswitch;
|
endswitch;
|
||||||
|
@ -60,6 +60,10 @@ class Doctrine_Connection_Transaction implements Countable, IteratorAggregate {
|
|||||||
* @var Doctrine_Validator $validator transaction validator
|
* @var Doctrine_Validator $validator transaction validator
|
||||||
*/
|
*/
|
||||||
private $validator;
|
private $validator;
|
||||||
|
/**
|
||||||
|
* @var array $invalid an array containing all invalid records within this transaction
|
||||||
|
*/
|
||||||
|
protected $invalid = array();
|
||||||
/**
|
/**
|
||||||
* @var array $update two dimensional pending update list, the records in
|
* @var array $update two dimensional pending update list, the records in
|
||||||
* this list will be updated when transaction is committed
|
* this list will be updated when transaction is committed
|
||||||
@ -159,11 +163,13 @@ class Doctrine_Connection_Transaction implements Countable, IteratorAggregate {
|
|||||||
throw new Doctrine_Exception($e->__toString());
|
throw new Doctrine_Exception($e->__toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
if($this->conn->getAttribute(Doctrine::ATTR_VLD)) {
|
if(count($this->invalid) > 0) {
|
||||||
if($this->validator->hasErrors()) {
|
$this->rollback();
|
||||||
$this->rollback();
|
|
||||||
throw new Doctrine_Validator_Exception($this->validator);
|
$tmp = $this->invalid;
|
||||||
}
|
$this->invalid = array();
|
||||||
|
|
||||||
|
throw new Doctrine_Validator_Exception($tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->conn->getDBH()->commit();
|
$this->conn->getDBH()->commit();
|
||||||
@ -172,6 +178,7 @@ class Doctrine_Connection_Transaction implements Countable, IteratorAggregate {
|
|||||||
|
|
||||||
$this->state = Doctrine_Connection_Transaction::STATE_OPEN;
|
$this->state = Doctrine_Connection_Transaction::STATE_OPEN;
|
||||||
$this->validator = null;
|
$this->validator = null;
|
||||||
|
$this->invalid = array();
|
||||||
|
|
||||||
} elseif($this->transaction_level == 1)
|
} elseif($this->transaction_level == 1)
|
||||||
$this->state = Doctrine_Connection_Transaction::STATE_ACTIVE;
|
$this->state = Doctrine_Connection_Transaction::STATE_ACTIVE;
|
||||||
@ -361,6 +368,21 @@ class Doctrine_Connection_Transaction implements Countable, IteratorAggregate {
|
|||||||
public function addDelete(Doctrine_Record $record) {
|
public function addDelete(Doctrine_Record $record) {
|
||||||
$name = $record->getTable()->getComponentName();
|
$name = $record->getTable()->getComponentName();
|
||||||
$this->delete[$name][] = $record;
|
$this->delete[$name][] = $record;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* addInvalid
|
||||||
|
* adds record into invalid records list
|
||||||
|
*
|
||||||
|
* @param Doctrine_Record $record
|
||||||
|
* @return boolean false if record already existed in invalid records list,
|
||||||
|
* otherwise true
|
||||||
|
*/
|
||||||
|
public function addInvalid(Doctrine_Record $record) {
|
||||||
|
if(in_array($record, $this->invalid))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$this->invalid[] = $record;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* returns the pending insert list
|
* returns the pending insert list
|
||||||
@ -387,6 +409,12 @@ class Doctrine_Connection_Transaction implements Countable, IteratorAggregate {
|
|||||||
return $this->delete;
|
return $this->delete;
|
||||||
}
|
}
|
||||||
public function getIterator() { }
|
public function getIterator() { }
|
||||||
|
/**
|
||||||
public function count() { }
|
* an alias for getTransactionLevel
|
||||||
|
*
|
||||||
|
* @return integer returns the nesting level of this transaction
|
||||||
|
*/
|
||||||
|
public function count() {
|
||||||
|
return $this->transaction_level;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,26 +65,6 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
* a Doctrine_Record turns into deleted state when it is deleted
|
* a Doctrine_Record turns into deleted state when it is deleted
|
||||||
*/
|
*/
|
||||||
const STATE_DELETED = 6;
|
const STATE_DELETED = 6;
|
||||||
|
|
||||||
/**
|
|
||||||
* CALLBACK CONSTANTS
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* RAW CALLBACK
|
|
||||||
*
|
|
||||||
* when using a raw callback and the property if a record is changed using this callback the
|
|
||||||
* record state remains untouched
|
|
||||||
*/
|
|
||||||
const CALLBACK_RAW = 1;
|
|
||||||
/**
|
|
||||||
* STATE-WISE CALLBACK
|
|
||||||
*
|
|
||||||
* state-wise callback means that when callback is used and the property is changed the
|
|
||||||
* record state is also updated
|
|
||||||
*/
|
|
||||||
const CALLBACK_STATEWISE = 2;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var object Doctrine_Table $table the factory that created this data access object
|
* @var object Doctrine_Table $table the factory that created this data access object
|
||||||
*/
|
*/
|
||||||
@ -119,9 +99,9 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
*/
|
*/
|
||||||
private $originals = array();
|
private $originals = array();
|
||||||
/**
|
/**
|
||||||
* @var array $filters
|
* @var Doctrine_Validator_ErrorStack error stack object
|
||||||
*/
|
*/
|
||||||
private $filters = array();
|
private $errorStack;
|
||||||
/**
|
/**
|
||||||
* @var integer $index this index is used for creating object identifiers
|
* @var integer $index this index is used for creating object identifiers
|
||||||
*/
|
*/
|
||||||
@ -155,7 +135,7 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check if the current connection has the records table in its registry
|
// Check if the current connection has the records table in its registry
|
||||||
// If not this is record is only used for creating table definition and setting up
|
// If not this record is only used for creating table definition and setting up
|
||||||
// relations.
|
// relations.
|
||||||
|
|
||||||
if($this->table->getConnection()->hasTable($this->table->getComponentName())) {
|
if($this->table->getConnection()->hasTable($this->table->getComponentName())) {
|
||||||
@ -210,6 +190,8 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
$this->table->getAttribute(Doctrine::ATTR_LISTENER)->onLoad($this);
|
$this->table->getAttribute(Doctrine::ATTR_LISTENER)->onLoad($this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->errorStack = new Doctrine_Validator_ErrorStack();
|
||||||
|
|
||||||
$repository = $this->table->getRepository();
|
$repository = $this->table->getRepository();
|
||||||
$repository->add($this);
|
$repository->add($this);
|
||||||
}
|
}
|
||||||
@ -218,6 +200,7 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
* initNullObject
|
* initNullObject
|
||||||
*
|
*
|
||||||
* @param Doctrine_Null $null
|
* @param Doctrine_Null $null
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function initNullObject(Doctrine_Null $null) {
|
public static function initNullObject(Doctrine_Null $null) {
|
||||||
self::$null = $null;
|
self::$null = $null;
|
||||||
@ -245,11 +228,37 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
public function getOID() {
|
public function getOID() {
|
||||||
return $this->oid;
|
return $this->oid;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* isValid
|
||||||
|
*
|
||||||
|
* @return boolean whether or not this record passes all column validations
|
||||||
|
*/
|
||||||
|
public function isValid() {
|
||||||
|
if( ! $this->table->getAttribute(Doctrine::ATTR_VLD))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
$validator = new Doctrine_Validator();
|
||||||
|
|
||||||
|
if($validator->validateRecord($this))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
$this->errorStack->merge($validator->getErrorStack());
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* getErrorStack
|
||||||
|
*
|
||||||
|
* @return Doctrine_Validator_ErrorStack returns the errorStack associated with this record
|
||||||
|
*/
|
||||||
|
public function getErrorStack() {
|
||||||
|
return $this->errorStack;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* setDefaultValues
|
* setDefaultValues
|
||||||
* sets the default values for records internal data
|
* sets the default values for records internal data
|
||||||
*
|
*
|
||||||
* @param boolean $overwrite whether or not to overwrite the already set values
|
* @param boolean $overwrite whether or not to overwrite the already set values
|
||||||
* @return boolean
|
* @return boolean
|
||||||
*/
|
*/
|
||||||
public function setDefaultValues($overwrite = false) {
|
public function setDefaultValues($overwrite = false) {
|
||||||
@ -721,7 +730,7 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
$value = $this->table->invokeSet($this, $name, $value);
|
$value = $this->table->invokeSet($this, $name, $value);
|
||||||
|
|
||||||
$value = $this->table->getAttribute(Doctrine::ATTR_LISTENER)->onSetProperty($this, $name, $value);
|
$value = $this->table->getAttribute(Doctrine::ATTR_LISTENER)->onSetProperty($this, $name, $value);
|
||||||
|
|
||||||
if($value === null)
|
if($value === null)
|
||||||
$value = self::$null;
|
$value = self::$null;
|
||||||
|
|
||||||
@ -825,7 +834,11 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
|
|
||||||
$saveLater = $conn->saveRelated($this);
|
$saveLater = $conn->saveRelated($this);
|
||||||
|
|
||||||
$conn->save($this);
|
if( ! $this->isValid()) {
|
||||||
|
$conn->getTransaction()->addInvalid($this);
|
||||||
|
} else {
|
||||||
|
$conn->save($this);
|
||||||
|
}
|
||||||
|
|
||||||
foreach($saveLater as $fk) {
|
foreach($saveLater as $fk) {
|
||||||
$table = $fk->getTable();
|
$table = $fk->getTable();
|
||||||
@ -1105,6 +1118,16 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
$this->modified = array();
|
$this->modified = array();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* assignOriginals
|
||||||
|
*
|
||||||
|
* @param string $alias
|
||||||
|
* @param Doctrine_Collection $coll
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function assignOriginals($alias, Doctrine_Collection $coll) {
|
||||||
|
$this->originals[$alias] = $coll;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* returns the primary keys of this object
|
* returns the primary keys of this object
|
||||||
*
|
*
|
||||||
|
@ -26,62 +26,15 @@
|
|||||||
* @url www.phpdoctrine.com
|
* @url www.phpdoctrine.com
|
||||||
* @license LGPL
|
* @license LGPL
|
||||||
*/
|
*/
|
||||||
class Doctrine_Validator {
|
class Doctrine_Validator {
|
||||||
/**
|
|
||||||
* ERROR CONSTANTS
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* constant for length validation error
|
|
||||||
*/
|
|
||||||
const ERR_LENGTH = 0;
|
|
||||||
/**
|
|
||||||
* constant for type validation error
|
|
||||||
*/
|
|
||||||
const ERR_TYPE = 1;
|
|
||||||
/**
|
|
||||||
* constant for general validation error
|
|
||||||
*/
|
|
||||||
const ERR_VALID = 2;
|
|
||||||
/**
|
|
||||||
* constant for unique validation error
|
|
||||||
*/
|
|
||||||
const ERR_UNIQUE = 3;
|
|
||||||
/**
|
|
||||||
* constant for blank validation error
|
|
||||||
*/
|
|
||||||
const ERR_NOTBLANK = 4;
|
|
||||||
/**
|
|
||||||
* constant for date validation error
|
|
||||||
*/
|
|
||||||
const ERR_DATE = 5;
|
|
||||||
/**
|
|
||||||
* constant for null validation error
|
|
||||||
*/
|
|
||||||
const ERR_NOTNULL = 6;
|
|
||||||
/**
|
|
||||||
* constant for enum validation error
|
|
||||||
*/
|
|
||||||
const ERR_ENUM = 7;
|
|
||||||
/**
|
|
||||||
* constant for range validation error
|
|
||||||
*/
|
|
||||||
const ERR_RANGE = 8;
|
|
||||||
/**
|
|
||||||
* constant for regexp validation error
|
|
||||||
*/
|
|
||||||
const ERR_REGEXP = 9;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var array $stack error stack
|
* @var array $stack error stack
|
||||||
*/
|
*/
|
||||||
private $stack = array();
|
private $stack = array();
|
||||||
/**
|
/**
|
||||||
* @var array $validators an array of validator objects
|
* @var array $validators an array of validator objects
|
||||||
*/
|
*/
|
||||||
private static $validators = array();
|
private static $validators = array();
|
||||||
/**
|
/**
|
||||||
* @var Doctrine_Null $null a Doctrine_Null object used for extremely fast
|
* @var Doctrine_Null $null a Doctrine_Null object used for extremely fast
|
||||||
* null value testing
|
* null value testing
|
||||||
@ -140,6 +93,8 @@ class Doctrine_Validator {
|
|||||||
foreach($data as $key => $value) {
|
foreach($data as $key => $value) {
|
||||||
if($value === self::$null)
|
if($value === self::$null)
|
||||||
$value = null;
|
$value = null;
|
||||||
|
elseif($value instanceof Doctrine_Record)
|
||||||
|
$value = $value->getIncremented();
|
||||||
|
|
||||||
$column = $columns[$key];
|
$column = $columns[$key];
|
||||||
|
|
||||||
@ -147,7 +102,7 @@ class Doctrine_Validator {
|
|||||||
$value = $record->getTable()->enumIndex($key, $value);
|
$value = $record->getTable()->enumIndex($key, $value);
|
||||||
|
|
||||||
if($value === false) {
|
if($value === false) {
|
||||||
$err[$key] = Doctrine_Validator::ERR_ENUM;
|
$err[$key] = 'enum';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -158,9 +113,10 @@ class Doctrine_Validator {
|
|||||||
$length = strlen($value);
|
$length = strlen($value);
|
||||||
|
|
||||||
if($length > $column[1]) {
|
if($length > $column[1]) {
|
||||||
$err[$key] = Doctrine_Validator::ERR_LENGTH;
|
$err[$key] = 'length';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ! is_array($column[2]))
|
if( ! is_array($column[2]))
|
||||||
$e = explode("|",$column[2]);
|
$e = explode("|",$column[2]);
|
||||||
else
|
else
|
||||||
@ -187,25 +143,23 @@ class Doctrine_Validator {
|
|||||||
$validator = self::getValidator($name);
|
$validator = self::getValidator($name);
|
||||||
if( ! $validator->validate($record, $key, $value, $args)) {
|
if( ! $validator->validate($record, $key, $value, $args)) {
|
||||||
|
|
||||||
$constant = 'Doctrine_Validator::ERR_'.strtoupper($name);
|
|
||||||
|
|
||||||
if(defined($constant))
|
$err[$key] = $name;
|
||||||
$err[$key] = constant($constant);
|
|
||||||
else
|
//$err[$key] = 'not valid';
|
||||||
$err[$key] = Doctrine_Validator::ERR_VALID;
|
|
||||||
|
|
||||||
// errors found quit validation looping for this column
|
// errors found quit validation looping for this column
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( ! self::isValidType($value, $column[0])) {
|
if( ! self::isValidType($value, $column[0])) {
|
||||||
$err[$key] = Doctrine_Validator::ERR_TYPE;
|
$err[$key] = 'type';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ! empty($err)) {
|
if( ! empty($err)) {
|
||||||
$this->stack[$component][] = $err;
|
$this->stack = $err;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
49
lib/Doctrine/Validator/ErrorStack.php
Normal file
49
lib/Doctrine/Validator/ErrorStack.php
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* This software consists of voluntary contributions made by many individuals
|
||||||
|
* and is licensed under the LGPL. For more information, see
|
||||||
|
* <http://www.phpdoctrine.com>.
|
||||||
|
*/
|
||||||
|
Doctrine::autoload('Doctrine_Access');
|
||||||
|
/**
|
||||||
|
* Doctrine_Validator_ErrorStack
|
||||||
|
*
|
||||||
|
* @author Konsta Vesterinen
|
||||||
|
* @license LGPL
|
||||||
|
* @package Doctrine
|
||||||
|
*/
|
||||||
|
class Doctrine_Validator_ErrorStack extends Doctrine_Access {
|
||||||
|
|
||||||
|
private $errors = array();
|
||||||
|
|
||||||
|
public function merge($stack) {
|
||||||
|
if(is_array($stack)) {
|
||||||
|
$this->errors = array_merge($this->errors, $stack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function get($name) {
|
||||||
|
if(isset($this->errors[$name]))
|
||||||
|
return $this->errors[$name];
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function set($name, $value) {
|
||||||
|
$this->errors[$name] = $value;
|
||||||
|
}
|
||||||
|
}
|
@ -1,24 +1,53 @@
|
|||||||
<?php
|
<?php
|
||||||
|
/*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* This software consists of voluntary contributions made by many individuals
|
||||||
|
* and is licensed under the LGPL. For more information, see
|
||||||
|
* <http://www.phpdoctrine.com>.
|
||||||
|
*/
|
||||||
Doctrine::autoload('Doctrine_Exception');
|
Doctrine::autoload('Doctrine_Exception');
|
||||||
|
/**
|
||||||
class Doctrine_Validator_Exception extends Doctrine_Exception {
|
* Doctrine_Validator_Exception
|
||||||
|
*
|
||||||
|
* @author Konsta Vesterinen
|
||||||
|
* @license LGPL
|
||||||
|
* @package Doctrine
|
||||||
|
*/
|
||||||
|
class Doctrine_Validator_Exception extends Doctrine_Exception implements Countable, IteratorAggregate {
|
||||||
/**
|
/**
|
||||||
* @var Doctrine_Validator $validator
|
* @var array $invalid
|
||||||
*/
|
*/
|
||||||
private $validator;
|
private $invalid = array();
|
||||||
/**
|
/**
|
||||||
* @param Doctrine_Validator $validator
|
* @param Doctrine_Validator $validator
|
||||||
*/
|
*/
|
||||||
public function __construct(Doctrine_Validator $validator) {
|
public function __construct(array $invalid) {
|
||||||
$this->validator = $validator;
|
$this->invalid = $invalid;
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* returns the error stack
|
public function getInvalidRecords() {
|
||||||
*
|
return $this->invalid;
|
||||||
* @return array
|
}
|
||||||
*/
|
|
||||||
public function getErrorStack() {
|
public function getIterator() {
|
||||||
return $this->validator->getErrorStack();
|
return new ArrayIterator($this->invalid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function count() {
|
||||||
|
return count($this->invalid);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* __toString
|
* __toString
|
||||||
@ -26,8 +55,8 @@ class Doctrine_Validator_Exception extends Doctrine_Exception {
|
|||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function __toString() {
|
public function __toString() {
|
||||||
$string = "Error stack : ".print_r($this->validator->getErrorStack(), true);
|
|
||||||
return $string.parent::__toString();
|
return parent::__toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,14 +82,11 @@ class Doctrine_ValidatorTestCase extends Doctrine_UnitTestCase {
|
|||||||
$stack = $validator->getErrorStack();
|
$stack = $validator->getErrorStack();
|
||||||
|
|
||||||
$this->assertTrue(is_array($stack));
|
$this->assertTrue(is_array($stack));
|
||||||
$this->assertTrue(isset($stack['ValidatorTest'][0]));
|
|
||||||
$stack = $stack['ValidatorTest'][0];
|
|
||||||
|
|
||||||
|
$this->assertEqual($stack['mystring'], 'notnull');
|
||||||
$this->assertEqual($stack['mystring'], Doctrine_Validator::ERR_NOTNULL);
|
$this->assertEqual($stack['myemail2'], 'notblank');
|
||||||
$this->assertEqual($stack['myemail2'], Doctrine_Validator::ERR_NOTBLANK);
|
$this->assertEqual($stack['myrange'], 'range');
|
||||||
$this->assertEqual($stack['myrange'], Doctrine_Validator::ERR_RANGE);
|
$this->assertEqual($stack['myregexp'], 'regexp');
|
||||||
$this->assertEqual($stack['myregexp'], Doctrine_Validator::ERR_REGEXP);
|
|
||||||
$test->mystring = 'str';
|
$test->mystring = 'str';
|
||||||
|
|
||||||
|
|
||||||
@ -113,22 +110,29 @@ class Doctrine_ValidatorTestCase extends Doctrine_UnitTestCase {
|
|||||||
|
|
||||||
$validator = new Doctrine_Validator();
|
$validator = new Doctrine_Validator();
|
||||||
$validator->validateRecord($user);
|
$validator->validateRecord($user);
|
||||||
$validator->validateRecord($email);
|
|
||||||
|
|
||||||
$stack = $validator->getErrorStack();
|
$stack = $validator->getErrorStack();
|
||||||
|
|
||||||
$this->assertTrue(is_array($stack));
|
$this->assertTrue(is_array($stack));
|
||||||
$this->assertEqual($stack["User"][0]["loginname"], Doctrine_Validator::ERR_LENGTH);
|
$this->assertEqual($stack["loginname"], 'length');
|
||||||
$this->assertEqual($stack["User"][0]["password"], Doctrine_Validator::ERR_LENGTH);
|
$this->assertEqual($stack["password"], 'length');
|
||||||
$this->assertEqual($stack["User"][0]["created"], Doctrine_Validator::ERR_TYPE);
|
$this->assertEqual($stack["created"], 'type');
|
||||||
|
|
||||||
|
|
||||||
$this->assertEqual($stack["Email"][0]["address"], Doctrine_Validator::ERR_VALID);
|
$validator->validateRecord($email);
|
||||||
|
$stack = $validator->getErrorStack();
|
||||||
|
$this->assertEqual($stack["address"], 'email');
|
||||||
$email->address = "arnold@example.com";
|
$email->address = "arnold@example.com";
|
||||||
|
|
||||||
$validator->validateRecord($email);
|
$validator->validateRecord($email);
|
||||||
$stack = $validator->getErrorStack();
|
$stack = $validator->getErrorStack();
|
||||||
$this->assertEqual($stack["Email"][1]["address"], Doctrine_Validator::ERR_UNIQUE);
|
|
||||||
|
|
||||||
|
$this->assertEqual($stack["address"], 'unique');
|
||||||
|
|
||||||
|
$email->isValid();
|
||||||
|
|
||||||
|
$this->assertTrue($email->getErrorStack() instanceof Doctrine_Validator_ErrorStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testIsValidEmail() {
|
public function testIsValidEmail() {
|
||||||
@ -156,7 +160,7 @@ class Doctrine_ValidatorTestCase extends Doctrine_UnitTestCase {
|
|||||||
$user->name = "this is an example of too long name not very good example but an example nevertheless";
|
$user->name = "this is an example of too long name not very good example but an example nevertheless";
|
||||||
$user->save();
|
$user->save();
|
||||||
} catch(Doctrine_Validator_Exception $e) {
|
} catch(Doctrine_Validator_Exception $e) {
|
||||||
$this->assertEqual($e->getErrorStack(),array("User" => array(array("name" => 0))));
|
$this->assertEqual($e->count(), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -164,12 +168,19 @@ class Doctrine_ValidatorTestCase extends Doctrine_UnitTestCase {
|
|||||||
$user->Email->address = "jackdaniels@drinkmore.info...";
|
$user->Email->address = "jackdaniels@drinkmore.info...";
|
||||||
$user->name = "this is an example of too long user name not very good example but an example nevertheles";
|
$user->name = "this is an example of too long user name not very good example but an example nevertheles";
|
||||||
$user->save();
|
$user->save();
|
||||||
|
$this->fail();
|
||||||
} catch(Doctrine_Validator_Exception $e) {
|
} catch(Doctrine_Validator_Exception $e) {
|
||||||
$a = $e->getErrorStack();
|
$this->pass();
|
||||||
|
$a = $e->getInvalidRecords();
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->assertTrue(is_array($a));
|
$this->assertTrue(is_array($a));
|
||||||
$this->assertEqual($a["Email"][0]["address"], Doctrine_Validator::ERR_VALID);
|
|
||||||
$this->assertEqual($a["User"][0]["name"], Doctrine_Validator::ERR_LENGTH);
|
$emailStack = $a[array_search($user->Email, $a)]->getErrorStack();
|
||||||
|
$userStack = $a[array_search($user, $a)]->getErrorStack();
|
||||||
|
|
||||||
|
$this->assertEqual($emailStack["address"], 'email');
|
||||||
|
$this->assertEqual($userStack["name"], 'length');
|
||||||
$this->manager->setAttribute(Doctrine::ATTR_VLD, false);
|
$this->manager->setAttribute(Doctrine::ATTR_VLD, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,9 +48,12 @@ require_once("DataDictSqliteTestCase.php");
|
|||||||
require_once("CustomResultSetOrderTestCase.php");
|
require_once("CustomResultSetOrderTestCase.php");
|
||||||
|
|
||||||
error_reporting(E_ALL);
|
error_reporting(E_ALL);
|
||||||
|
print "<pre>";
|
||||||
|
|
||||||
$test = new GroupTest("Doctrine Framework Unit Tests");
|
$test = new GroupTest("Doctrine Framework Unit Tests");
|
||||||
|
|
||||||
|
$test->addTestCase(new Doctrine_ValidatorTestCase());
|
||||||
|
|
||||||
$test->addTestCase(new Doctrine_Query_MultiJoin_TestCase());
|
$test->addTestCase(new Doctrine_Query_MultiJoin_TestCase());
|
||||||
|
|
||||||
$test->addTestCase(new Doctrine_Relation_TestCase());
|
$test->addTestCase(new Doctrine_Relation_TestCase());
|
||||||
@ -75,8 +78,6 @@ $test->addTestCase(new Doctrine_BatchIteratorTestCase());
|
|||||||
|
|
||||||
$test->addTestCase(new Doctrine_ConfigurableTestCase());
|
$test->addTestCase(new Doctrine_ConfigurableTestCase());
|
||||||
|
|
||||||
$test->addTestCase(new Doctrine_ValidatorTestCase());
|
|
||||||
|
|
||||||
$test->addTestCase(new Doctrine_Collection_OffsetTestCase());
|
$test->addTestCase(new Doctrine_Collection_OffsetTestCase());
|
||||||
|
|
||||||
$test->addTestCase(new Doctrine_PessimisticLockingTestCase());
|
$test->addTestCase(new Doctrine_PessimisticLockingTestCase());
|
||||||
@ -124,6 +125,7 @@ $test->addTestCase(new Doctrine_Query_ComponentAlias_TestCase());
|
|||||||
$test->addTestCase(new Doctrine_Query_Subquery_TestCase());
|
$test->addTestCase(new Doctrine_Query_Subquery_TestCase());
|
||||||
|
|
||||||
$test->addTestCase(new Doctrine_Record_Filter_TestCase());
|
$test->addTestCase(new Doctrine_Record_Filter_TestCase());
|
||||||
|
|
||||||
//$test->addTestCase(new Doctrine_Cache_FileTestCase());
|
//$test->addTestCase(new Doctrine_Cache_FileTestCase());
|
||||||
//$test->addTestCase(new Doctrine_Cache_SqliteTestCase());
|
//$test->addTestCase(new Doctrine_Cache_SqliteTestCase());
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user