Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
D
doctrine-dbal
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Tomáš Trávníček
doctrine-dbal
Commits
3214810e
Commit
3214810e
authored
Dec 29, 2006
by
romanb
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Temporary fix for #254 until there's a better solution available.
Ticket: 254
parent
239995d3
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
286 additions
and
283 deletions
+286
-283
Validator.php
lib/Doctrine/Validator.php
+286
-283
No files found.
lib/Doctrine/Validator.php
View file @
3214810e
<?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_Validator
* Doctrine_Validator performs validations in record properties
*
* @package Doctrine
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @category Object Relational Mapping
* @link www.phpdoctrine.com
* @since 1.0
* @version $Revision$
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
*/
class
Doctrine_Validator
{
/**
* @var array $validators an array of validator objects
*/
private
static
$validators
=
array
();
/**
* @var Doctrine_Null $null a Doctrine_Null object used for extremely fast
* null value testing
*/
private
static
$null
;
/**
* initNullObject
*
* @param Doctrine_Null $null
* @return void
*/
public
static
function
initNullObject
(
Doctrine_Null
$null
)
{
self
::
$null
=
$null
;
}
/**
* returns a validator object
*
* @param string $name
* @return Doctrine_Validator_Interface
*/
public
static
function
getValidator
(
$name
)
{
if
(
!
isset
(
self
::
$validators
[
$name
]))
{
$class
=
"Doctrine_Validator_"
.
ucwords
(
strtolower
(
$name
));
if
(
class_exists
(
$class
))
{
self
::
$validators
[
$name
]
=
new
$class
;
}
else
{
throw
new
Doctrine_Exception
(
"Validator named '
$name
' not availible."
);
}
}
return
self
::
$validators
[
$name
];
}
/**
* validates a given record and saves possible errors
* in Doctrine_Validator::$stack
*
* @param Doctrine_Record $record
* @return void
*/
public
function
validateRecord
(
Doctrine_Record
$record
)
{
$columns
=
$record
->
getTable
()
->
getColumns
();
$component
=
$record
->
getTable
()
->
getComponentName
();
$errorStack
=
$record
->
getErrorStack
();
// if record is transient all fields will be validated
// if record is persistent only the modified fields will be validated
$data
=
(
$record
->
exists
())
?
$record
->
getModified
()
:
$record
->
getData
();
$err
=
array
();
foreach
(
$data
as
$key
=>
$value
)
{
if
(
$value
===
self
::
$null
)
$value
=
null
;
elseif
(
$value
instanceof
Doctrine_Record
)
$value
=
$value
->
getIncremented
();
$column
=
$columns
[
$key
];
if
(
$column
[
0
]
==
"enum"
)
{
$value
=
$record
->
getTable
()
->
enumIndex
(
$key
,
$value
);
if
(
$value
===
false
)
{
$errorStack
->
add
(
$key
,
'enum'
);
continue
;
}
}
if
(
$record
->
getTable
()
->
getAttribute
(
Doctrine
::
ATTR_AUTO_LENGTH_VLD
))
{
if
(
!
$this
->
validateLength
(
$column
,
$key
,
$value
))
{
$errorStack
->
add
(
$key
,
'length'
);
continue
;
}
}
if
(
!
is_array
(
$column
[
2
]))
{
$e
=
explode
(
"|"
,
$column
[
2
]);
}
else
{
$e
=
$column
[
2
];
}
foreach
(
$e
as
$k
=>
$arg
)
{
if
(
is_string
(
$k
))
{
$name
=
$k
;
$args
=
$arg
;
}
else
{
$args
=
explode
(
":"
,
$arg
);
$name
=
array_shift
(
$args
);
if
(
!
isset
(
$args
[
0
]))
{
$args
[
0
]
=
''
;
}
}
if
(
empty
(
$name
)
||
$name
==
'primary'
||
$name
==
'protected'
||
$name
==
'autoincrement'
||
$name
==
'default'
)
{
continue
;
}
if
(
strtolower
(
$name
)
==
'length'
)
{
if
(
!
$record
->
getTable
()
->
getAttribute
(
Doctrine
::
ATTR_AUTO_LENGTH_VLD
))
{
if
(
!
$this
->
validateLength
(
$column
,
$key
,
$value
))
{
$errorStack
->
add
(
$key
,
'length'
);
}
}
continue
;
}
if
(
strtolower
(
$name
)
==
'type'
)
{
if
(
!
$record
->
getTable
()
->
getAttribute
(
Doctrine
::
ATTR_AUTO_TYPE_VLD
))
{
if
(
!
self
::
isValidType
(
$value
,
$column
[
0
]))
{
$errorStack
->
add
(
$key
,
'type'
);
}
}
continue
;
}
$validator
=
self
::
getValidator
(
$name
);
if
(
!
$validator
->
validate
(
$record
,
$key
,
$value
,
$args
))
{
$errorStack
->
add
(
$key
,
$name
);
//$err[$key] = 'not valid';
// errors found quit validation looping for this column
//break;
}
}
if
(
$record
->
getTable
()
->
getAttribute
(
Doctrine
::
ATTR_AUTO_TYPE_VLD
))
{
if
(
!
self
::
isValidType
(
$value
,
$column
[
0
]))
{
$errorStack
->
add
(
$key
,
'type'
);
continue
;
}
}
}
}
/**
* Enter description here...
*
*/
private
function
validateLength
(
$column
,
$key
,
$value
)
{
if
(
$column
[
0
]
==
"array"
||
$column
[
0
]
==
"object"
)
{
$length
=
strlen
(
serialize
(
$value
));
}
else
{
$length
=
strlen
(
$value
);
}
if
(
$length
>
$column
[
1
])
{
return
false
;
}
return
true
;
}
/**
* whether or not this validator has errors
*
* @return boolean
*/
public
function
hasErrors
()
{
return
(
count
(
$this
->
stack
)
>
0
);
}
/**
* converts a doctrine type to native php type
*
* @param $doctrineType
* @return string
*/
public
static
function
phpType
(
$doctrineType
)
{
switch
(
$doctrineType
)
{
case
'enum'
:
return
'integer'
;
case
'blob'
:
case
'clob'
:
case
'mbstring'
:
case
'timestamp'
:
case
'date'
:
case
'gzip'
:
return
'string'
;
break
;
default
:
return
$doctrineType
;
}
}
/**
* returns whether or not the given variable is
* valid type
*
* @param mixed $var
* @param string $type
* @return boolean
*/
public
static
function
isValidType
(
$var
,
$type
)
{
if
(
$type
==
'boolean'
)
return
true
;
$looseType
=
self
::
gettype
(
$var
);
$type
=
self
::
phpType
(
$type
);
switch
(
$looseType
)
{
case
'float'
:
case
'double'
:
case
'integer'
:
if
(
$type
==
'string'
||
$type
==
'float'
)
return
true
;
case
'string'
:
case
'array'
:
case
'object'
:
return
(
$type
===
$looseType
);
break
;
case
'NULL'
:
return
true
;
break
;
};
}
/**
* returns the type of loosely typed variable
*
* @param mixed $var
* @return string
*/
public
static
function
gettype
(
$var
)
{
$type
=
gettype
(
$var
);
switch
(
$type
)
{
case
'string'
:
if
(
preg_match
(
"/^[0-9]+$/"
,
$var
))
{
return
'integer'
;
}
elseif
(
is_numeric
(
$var
))
{
return
'float'
;
}
else
{
return
$type
;
}
break
;
default
:
return
$type
;
};
}
}
<?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_Validator
* Doctrine_Validator performs validations in record properties
*
* @package Doctrine
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @category Object Relational Mapping
* @link www.phpdoctrine.com
* @since 1.0
* @version $Revision$
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
*/
class
Doctrine_Validator
{
/**
* @var array $validators an array of validator objects
*/
private
static
$validators
=
array
();
/**
* @var Doctrine_Null $null a Doctrine_Null object used for extremely fast
* null value testing
*/
private
static
$null
;
/**
* initNullObject
*
* @param Doctrine_Null $null
* @return void
*/
public
static
function
initNullObject
(
Doctrine_Null
$null
)
{
self
::
$null
=
$null
;
}
/**
* returns a validator object
*
* @param string $name
* @return Doctrine_Validator_Interface
*/
public
static
function
getValidator
(
$name
)
{
if
(
!
isset
(
self
::
$validators
[
$name
]))
{
$class
=
"Doctrine_Validator_"
.
ucwords
(
strtolower
(
$name
));
if
(
class_exists
(
$class
))
{
self
::
$validators
[
$name
]
=
new
$class
;
}
else
{
throw
new
Doctrine_Exception
(
"Validator named '
$name
' not availible."
);
}
}
return
self
::
$validators
[
$name
];
}
/**
* validates a given record and saves possible errors
* in Doctrine_Validator::$stack
*
* @param Doctrine_Record $record
* @return void
*/
public
function
validateRecord
(
Doctrine_Record
$record
)
{
$columns
=
$record
->
getTable
()
->
getColumns
();
$component
=
$record
->
getTable
()
->
getComponentName
();
$errorStack
=
$record
->
getErrorStack
();
// if record is transient all fields will be validated
// if record is persistent only the modified fields will be validated
$data
=
(
$record
->
exists
())
?
$record
->
getModified
()
:
$record
->
getData
();
$err
=
array
();
foreach
(
$data
as
$key
=>
$value
)
{
if
(
$value
===
self
::
$null
)
$value
=
null
;
elseif
(
$value
instanceof
Doctrine_Record
)
$value
=
$value
->
getIncremented
();
$column
=
$columns
[
$key
];
if
(
$column
[
0
]
==
"enum"
)
{
$value
=
$record
->
getTable
()
->
enumIndex
(
$key
,
$value
);
if
(
$value
===
false
)
{
$errorStack
->
add
(
$key
,
'enum'
);
continue
;
}
}
if
(
$record
->
getTable
()
->
getAttribute
(
Doctrine
::
ATTR_AUTO_LENGTH_VLD
))
{
if
(
!
$this
->
validateLength
(
$column
,
$key
,
$value
))
{
$errorStack
->
add
(
$key
,
'length'
);
continue
;
}
}
if
(
!
is_array
(
$column
[
2
]))
{
$e
=
explode
(
"|"
,
$column
[
2
]);
}
else
{
$e
=
$column
[
2
];
}
foreach
(
$e
as
$k
=>
$arg
)
{
if
(
is_string
(
$k
))
{
$name
=
$k
;
$args
=
$arg
;
}
else
{
$args
=
explode
(
":"
,
$arg
);
$name
=
array_shift
(
$args
);
if
(
!
isset
(
$args
[
0
]))
{
$args
[
0
]
=
''
;
}
}
if
(
empty
(
$name
)
||
$name
==
'primary'
||
$name
==
'protected'
||
$name
==
'autoincrement'
||
$name
==
'default'
)
{
continue
;
}
if
(
strtolower
(
$name
)
==
'length'
)
{
if
(
!
$record
->
getTable
()
->
getAttribute
(
Doctrine
::
ATTR_AUTO_LENGTH_VLD
))
{
if
(
!
$this
->
validateLength
(
$column
,
$key
,
$value
))
{
$errorStack
->
add
(
$key
,
'length'
);
}
}
continue
;
}
if
(
strtolower
(
$name
)
==
'type'
)
{
if
(
!
$record
->
getTable
()
->
getAttribute
(
Doctrine
::
ATTR_AUTO_TYPE_VLD
))
{
if
(
!
self
::
isValidType
(
$value
,
$column
[
0
]))
{
$errorStack
->
add
(
$key
,
'type'
);
}
}
continue
;
}
$validator
=
self
::
getValidator
(
$name
);
if
(
!
$validator
->
validate
(
$record
,
$key
,
$value
,
$args
))
{
$errorStack
->
add
(
$key
,
$name
);
//$err[$key] = 'not valid';
// errors found quit validation looping for this column
//break;
}
}
if
(
$record
->
getTable
()
->
getAttribute
(
Doctrine
::
ATTR_AUTO_TYPE_VLD
))
{
if
(
!
self
::
isValidType
(
$value
,
$column
[
0
]))
{
$errorStack
->
add
(
$key
,
'type'
);
continue
;
}
}
}
}
/**
* Enter description here...
*
*/
private
function
validateLength
(
$column
,
$key
,
$value
)
{
if
(
$column
[
0
]
==
"timestamp"
)
{
return
true
;
}
else
if
(
$column
[
0
]
==
"array"
||
$column
[
0
]
==
"object"
)
{
$length
=
strlen
(
serialize
(
$value
));
}
else
{
$length
=
strlen
(
$value
);
}
if
(
$length
>
$column
[
1
])
{
return
false
;
}
return
true
;
}
/**
* whether or not this validator has errors
*
* @return boolean
*/
public
function
hasErrors
()
{
return
(
count
(
$this
->
stack
)
>
0
);
}
/**
* converts a doctrine type to native php type
*
* @param $doctrineType
* @return string
*/
public
static
function
phpType
(
$doctrineType
)
{
switch
(
$doctrineType
)
{
case
'enum'
:
return
'integer'
;
case
'blob'
:
case
'clob'
:
case
'mbstring'
:
case
'timestamp'
:
case
'date'
:
case
'gzip'
:
return
'string'
;
break
;
default
:
return
$doctrineType
;
}
}
/**
* returns whether or not the given variable is
* valid type
*
* @param mixed $var
* @param string $type
* @return boolean
*/
public
static
function
isValidType
(
$var
,
$type
)
{
if
(
$type
==
'boolean'
)
return
true
;
$looseType
=
self
::
gettype
(
$var
);
$type
=
self
::
phpType
(
$type
);
switch
(
$looseType
)
{
case
'float'
:
case
'double'
:
case
'integer'
:
if
(
$type
==
'string'
||
$type
==
'float'
)
return
true
;
case
'string'
:
case
'array'
:
case
'object'
:
return
(
$type
===
$looseType
);
break
;
case
'NULL'
:
return
true
;
break
;
};
}
/**
* returns the type of loosely typed variable
*
* @param mixed $var
* @return string
*/
public
static
function
gettype
(
$var
)
{
$type
=
gettype
(
$var
);
switch
(
$type
)
{
case
'string'
:
if
(
preg_match
(
"/^[0-9]+$/"
,
$var
))
{
return
'integer'
;
}
elseif
(
is_numeric
(
$var
))
{
return
'float'
;
}
else
{
return
$type
;
}
break
;
default
:
return
$type
;
};
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment