浏览代码

Added Validator::getEmptyMessage and getRequiredMessage

Jeremy Harris 8 年之前
父节点
当前提交
4a9813f14d
共有 3 个文件被更改,包括 82 次插入20 次删除
  1. 38 14
      src/Validation/Validator.php
  2. 6 6
      src/View/Form/EntityContext.php
  3. 38 0
      tests/TestCase/Validation/ValidatorTest.php

+ 38 - 14
src/Validation/Validator.php

@@ -104,14 +104,6 @@ class Validator implements ArrayAccess, IteratorAggregate, Countable
     {
         $errors = [];
 
-        $requiredMessage = 'This field is required';
-        $emptyMessage = 'This field cannot be left empty';
-
-        if ($this->_useI18n) {
-            $requiredMessage = __d('cake', 'This field is required');
-            $emptyMessage = __d('cake', 'This field cannot be left empty');
-        }
-
         foreach ($this->_fields as $name => $field) {
             $keyPresent = array_key_exists($name, $data);
 
@@ -119,9 +111,7 @@ class Validator implements ArrayAccess, IteratorAggregate, Countable
             $context = compact('data', 'newRecord', 'field', 'providers');
 
             if (!$keyPresent && !$this->_checkPresence($field, $context)) {
-                $errors[$name]['_required'] = isset($this->_presenceMessages[$name])
-                    ? $this->_presenceMessages[$name]
-                    : $requiredMessage;
+                $errors[$name]['_required'] = $this->getRequiredMessage($name);
                 continue;
             }
             if (!$keyPresent) {
@@ -132,9 +122,7 @@ class Validator implements ArrayAccess, IteratorAggregate, Countable
             $isEmpty = $this->_fieldIsEmpty($data[$name]);
 
             if (!$canBeEmpty && $isEmpty) {
-                $errors[$name]['_empty'] = isset($this->_allowEmptyMessages[$name])
-                    ? $this->_allowEmptyMessages[$name]
-                    : $emptyMessage;
+                $errors[$name]['_empty'] = $this->getEmptyMessage($name);
                 continue;
             }
 
@@ -1942,6 +1930,42 @@ class Validator implements ArrayAccess, IteratorAggregate, Countable
     }
 
     /**
+     * Gets the required message for a field
+     *
+     * @param string $field Field name
+     * @return string
+     */
+    public function getRequiredMessage($field)
+    {
+        $defaultMessage = 'This field is required';
+        if ($this->_useI18n) {
+            $defaultMessage = __d('cake', 'This field is required');
+        }
+
+        return isset($this->_presenceMessages[$field])
+            ? $this->_presenceMessages[$field]
+            : $defaultMessage;
+    }
+
+    /**
+     * Gets the empty message for a field
+     *
+     * @param string $field Field name
+     * @return string
+     */
+    public function getEmptyMessage($field)
+    {
+        $defaultMessage = 'This field cannot be left empty';
+        if ($this->_useI18n) {
+            $defaultMessage = __d('cake', 'This field cannot be left empty');
+        }
+
+        return isset($this->_allowEmptyMessages[$field])
+            ? $this->_allowEmptyMessages[$field]
+            : $defaultMessage;
+    }
+
+    /**
      * Returns false if any validation for the passed rule set should be stopped
      * due to the field missing in the data array
      *

+ 6 - 6
src/View/Form/EntityContext.php

@@ -441,14 +441,14 @@ class EntityContext implements ContextInterface
 
         $ruleset = $validator->field($fieldName);
 
-        $presenceErrors = $validator->errors([]);
-        $emptyErrors = $validator->errors([$fieldName => '']);
+        $requiredMessage = $validator->getRequiredMessage($fieldName);
+        $emptyMessage = $validator->getEmptyMessage($fieldName);
 
-        if ($ruleset->isPresenceRequired() && isset($presenceErrors[$fieldName])) {
-            return $presenceErrors[$fieldName]['_required'] ?? null;
+        if ($ruleset->isPresenceRequired() && $requiredMessage) {
+            return $requiredMessage;
         }
-        if (!$ruleset->isEmptyAllowed() && isset($emptyErrors[$fieldName])) {
-            return $emptyErrors[$fieldName]['_empty'] ?? null;
+        if (!$ruleset->isEmptyAllowed() && $emptyMessage) {
+            return $emptyMessage;
         }
 
         return null;

+ 38 - 0
tests/TestCase/Validation/ValidatorTest.php

@@ -27,6 +27,44 @@ class ValidatorTest extends TestCase
 {
 
     /**
+     * tests getRequiredMessage
+     *
+     * @return void
+     */
+    public function testGetRequiredMessage()
+    {
+        $validator = new Validator();
+        $this->assertSame('This field is required', $validator->getRequiredMessage('field'));
+
+        $validator = new Validator();
+        $validator->requirePresence('field');
+        $this->assertSame('This field is required', $validator->getRequiredMessage('field'));
+
+        $validator = new Validator();
+        $validator->requirePresence('field', true, 'Custom message');
+        $this->assertSame('Custom message', $validator->getRequiredMessage('field'));
+    }
+
+    /**
+     * tests getEmptyMessage
+     *
+     * @return void
+     */
+    public function testGetEmptyMessage()
+    {
+        $validator = new Validator();
+        $this->assertSame('This field cannot be left empty', $validator->getEmptyMessage('field'));
+
+        $validator = new Validator();
+        $validator->requirePresence('field');
+        $this->assertSame('This field cannot be left empty', $validator->getEmptyMessage('field'));
+
+        $validator = new Validator();
+        $validator->notEmpty('field', 'Custom message');
+        $this->assertSame('Custom message', $validator->getEmptyMessage('field'));
+    }
+
+    /**
      * Testing you can dynamically add rules to a field
      *
      * @return void