Просмотр исходного кода

[ZF-9968] Zend_Validate_NotEmpty:

- added object validation
- added count validation
- added serializeable validation

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@22659 44c647ce-9c0f-0410-b52a-842ac1e357ba
thomas 15 лет назад
Родитель
Сommit
7a6aac1a25

+ 24 - 0
documentation/manual/en/module_specs/Zend_Validate-NotEmpty.xml

@@ -138,6 +138,30 @@ $result = $valid->isValid($value);
 
             <listitem>
                 <para>
+                    <emphasis>object</emphasis>: Returns <constant>TRUE</constant>.
+                    <constant>FALSE</constant> will be returned when <property>object</property> is
+                    not allowed but an object is given.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>object_string</emphasis>: Returns <constant>FALSE</constant> when an
+                    object is given and it's <methodname>__toString()</methodname> method returns an
+                   empty string.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>object_count</emphasis>: Returns <constant>FALSE</constant> when an
+                    object is given, it has an <classname>Countable</classname> interface and it's
+                    count is 0.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
                     <emphasis>all</emphasis>: Returns <constant>FALSE</constant> on all above types.
                 </para>
             </listitem>

+ 64 - 22
library/Zend/Validate/NotEmpty.php

@@ -32,31 +32,37 @@ require_once 'Zend/Validate/Abstract.php';
  */
 class Zend_Validate_NotEmpty extends Zend_Validate_Abstract
 {
-    const BOOLEAN      = 1;
-    const INTEGER      = 2;
-    const FLOAT        = 4;
-    const STRING       = 8;
-    const ZERO         = 16;
-    const EMPTY_ARRAY  = 32;
-    const NULL         = 64;
-    const PHP          = 127;
-    const SPACE        = 128;
-    const ALL          = 255;
+    const BOOLEAN       = 1;
+    const INTEGER       = 2;
+    const FLOAT         = 4;
+    const STRING        = 8;
+    const ZERO          = 16;
+    const EMPTY_ARRAY   = 32;
+    const NULL          = 64;
+    const PHP           = 127;
+    const SPACE         = 128;
+    const OBJECT        = 256;
+    const OBJECT_STRING = 512;
+    const OBJECT_COUNT  = 1024;
+    const ALL           = 2047;
 
     const INVALID  = 'notEmptyInvalid';
     const IS_EMPTY = 'isEmpty';
 
     protected $_constants = array(
-        self::BOOLEAN      => 'boolean',
-        self::INTEGER      => 'integer',
-        self::FLOAT        => 'float',
-        self::STRING       => 'string',
-        self::ZERO         => 'zero',
-        self::EMPTY_ARRAY  => 'array',
-        self::NULL         => 'null',
-        self::PHP          => 'php',
-        self::SPACE        => 'space',
-        self::ALL          => 'all'
+        self::BOOLEAN       => 'boolean',
+        self::INTEGER       => 'integer',
+        self::FLOAT         => 'float',
+        self::STRING        => 'string',
+        self::ZERO          => 'zero',
+        self::EMPTY_ARRAY   => 'array',
+        self::NULL          => 'null',
+        self::PHP           => 'php',
+        self::SPACE         => 'space',
+        self::OBJECT        => 'object',
+        self::OBJECT_STRING => 'objectstring',
+        self::OBJECT_COUNT  => 'objectcount',
+        self::ALL           => 'all',
     );
 
     /**
@@ -72,7 +78,7 @@ class Zend_Validate_NotEmpty extends Zend_Validate_Abstract
      *
      * @var integer
      */
-    protected $_type = 237;
+    protected $_type = 493;
 
     /**
      * Constructor
@@ -152,13 +158,49 @@ class Zend_Validate_NotEmpty extends Zend_Validate_Abstract
     public function isValid($value)
     {
         if (!is_null($value) && !is_string($value) && !is_int($value) && !is_float($value) &&
-            !is_bool($value) && !is_array($value)) {
+            !is_bool($value) && !is_array($value) && !is_object($value)) {
             $this->_error(self::INVALID);
             return false;
         }
 
         $type    = $this->getType();
         $this->_setValue($value);
+        $object  = false;
+
+        // OBJECT_COUNT (countable object)
+        if ($type >= self::OBJECT_COUNT) {
+            $type -= self::OBJECT_COUNT;
+            $object = true;
+
+            if (is_object($value) && ($value instanceof Countable) && (count($value) == 0)) {
+                $this->_error(self::IS_EMPTY);
+                return false;
+            }
+        }
+
+        // OBJECT_STRING (object's toString)
+        if ($type >= self::OBJECT_STRING) {
+            $type -= self::OBJECT_STRING;
+            $object = true;
+
+            if ((is_object($value) && (!method_exists($value, '__toString'))) ||
+                (is_object($value) && (method_exists($value, '__toString')) && (((string) $value) == ""))) {
+                $this->_error(self::IS_EMPTY);
+                return false;
+            }
+        }
+
+        // OBJECT (object)
+        if ($type >= self::OBJECT) {
+            $type -= self::OBJECT;
+            // fall trough, objects are always not empty
+        } else if ($object === false) {
+            // object not allowed but object given -> return false
+            if (is_object($value)) {
+                $this->_error(self::IS_EMPTY);
+                return false;
+            }
+        }
 
         // SPACE ('   ')
         if ($type >= self::SPACE) {

+ 51 - 2
tests/Zend/Validate/NotEmptyTest.php

@@ -531,7 +531,7 @@ class Zend_Validate_NotEmptyTest extends PHPUnit_Framework_TestCase
      */
     public function testGetType()
     {
-        $this->assertEquals(237, $this->_validator->getType());
+        $this->assertEquals(493, $this->_validator->getType());
     }
 
     /**
@@ -558,7 +558,7 @@ class Zend_Validate_NotEmptyTest extends PHPUnit_Framework_TestCase
     public function testNonStringValidation()
     {
         $v2 = new Zend_Validate_NotEmpty();
-        $this->assertFalse($this->_validator->isValid($v2));
+        $this->assertTrue($this->_validator->isValid($v2));
     }
 
     /**
@@ -575,6 +575,55 @@ class Zend_Validate_NotEmptyTest extends PHPUnit_Framework_TestCase
         $this->assertTrue(array_key_exists('isEmpty', $messages));
         $this->assertContains("can't be empty", $messages['isEmpty']);
     }
+
+    /**
+     * @return void
+     */
+    public function testObjects()
+    {
+        $valid = new Zend_Validate_NotEmpty(Zend_Validate_NotEmpty::STRING);
+        $object = new ClassTest1();
+
+        $this->assertFalse($valid->isValid($object));
+
+        $valid = new Zend_Validate_NotEmpty(Zend_Validate_NotEmpty::OBJECT);
+        $this->assertTrue($valid->isValid($object));
+    }
+
+    /**
+     * @return void
+     */
+    public function testStringObjects()
+    {
+        $valid = new Zend_Validate_NotEmpty(Zend_Validate_NotEmpty::STRING);
+        $object = new ClassTest2();
+
+        $this->assertFalse($valid->isValid($object));
+
+        $valid = new Zend_Validate_NotEmpty(Zend_Validate_NotEmpty::OBJECT_STRING);
+        $this->assertTrue($valid->isValid($object));
+
+        $object = new ClassTest3();
+        $this->assertFalse($valid->isValid($object));
+    }
+}
+
+class ClassTest1 {}
+
+class ClassTest2
+{
+    public function __toString()
+    {
+        return 'Test';
+    }
+}
+
+class ClassTest3
+{
+    public function toString()
+    {
+        return '';
+    }
 }
 
 // Call Zend_Validate_NotEmptyTest::main() if this source file is executed directly.