Browse Source

Merge pull request #5801 from cakephp/3.0-ruleschecker-name

Allow specifying name for application rules.
Mark Story 11 years ago
parent
commit
e82023deec
2 changed files with 58 additions and 17 deletions
  1. 28 13
      src/ORM/RulesChecker.php
  2. 30 4
      tests/TestCase/ORM/RulesCheckerIntegrationTest.php

+ 28 - 13
src/ORM/RulesChecker.php

@@ -131,13 +131,14 @@ class RulesChecker
      *
      * @param callable $rule A callable function or object that will return whether
      * the entity is valid or not.
+     * @param string $name The alias for a rule.
      * @param array $options List of extra options to pass to the rule callable as
      * second argument.
      * @return $this
      */
-    public function add(callable $rule, array $options = [])
+    public function add(callable $rule, $name = null, array $options = [])
     {
-        $this->_rules[] = $this->_addError($rule, $options);
+        $this->_rules[] = $this->_addError($rule, $name, $options);
         return $this;
     }
 
@@ -154,13 +155,14 @@ class RulesChecker
      *
      * @param callable $rule A callable function or object that will return whether
      * the entity is valid or not.
+     * @param string $name The alias for a rule.
      * @param array $options List of extra options to pass to the rule callable as
      * second argument.
      * @return $this
      */
-    public function addCreate(callable $rule, array $options = [])
+    public function addCreate(callable $rule, $name = null, array $options = [])
     {
-        $this->_createRules[] = $this->_addError($rule, $options);
+        $this->_createRules[] = $this->_addError($rule, $name, $options);
         return $this;
     }
 
@@ -177,13 +179,14 @@ class RulesChecker
      *
      * @param callable $rule A callable function or object that will return whether
      * the entity is valid or not.
+     * @param string $name The alias for a rule.
      * @param array $options List of extra options to pass to the rule callable as
      * second argument.
      * @return $this
      */
-    public function addUpdate(callable $rule, array $options = [])
+    public function addUpdate(callable $rule, $name = null, array $options = [])
     {
-        $this->_updateRules[] = $this->_addError($rule, $options);
+        $this->_updateRules[] = $this->_addError($rule, $name, $options);
         return $this;
     }
 
@@ -200,13 +203,14 @@ class RulesChecker
      *
      * @param callable $rule A callable function or object that will return whether
      * the entity is valid or not.
+     * @param string $name The alias for a rule.
      * @param array $options List of extra options to pass to the rule callable as
      * second argument.
      * @return $this
      */
-    public function addDelete(callable $rule, array $options = [])
+    public function addDelete(callable $rule, $name = null, array $options = [])
     {
-        $this->_deleteRules[] = $this->_addError($rule, $options);
+        $this->_deleteRules[] = $this->_addError($rule, $name, $options);
         return $this;
     }
 
@@ -317,7 +321,7 @@ class RulesChecker
         }
 
         $errorField = current($fields);
-        return $this->_addError(new IsUnique($fields), compact('errorField', 'message'));
+        return $this->_addError(new IsUnique($fields), '_isUnique', compact('errorField', 'message'));
     }
 
     /**
@@ -351,7 +355,7 @@ class RulesChecker
         }
 
         $errorField = $field;
-        return $this->_addError(new ExistsIn($field, $table), compact('errorField', 'message'));
+        return $this->_addError(new ExistsIn($field, $table), '_existsIn', compact('errorField', 'message'));
     }
 
     /**
@@ -359,12 +363,18 @@ class RulesChecker
      * property in the entity is marked as invalid.
      *
      * @param callable $rule The rule to decorate
+     * @param string $name The alias for a rule.
      * @param array $options The options containing the error message and field
      * @return callable
      */
-    protected function _addError($rule, $options)
+    protected function _addError($rule, $name, $options)
     {
-        return function ($entity, $scope) use ($rule, $options) {
+        if (is_array($name)) {
+            $options = $name;
+            $name = null;
+        }
+
+        return function ($entity, $scope) use ($rule, $name, $options) {
             $pass = $rule($entity, $options + $scope);
 
             if ($pass || empty($options['errorField'])) {
@@ -372,7 +382,12 @@ class RulesChecker
             }
 
             $message = isset($options['message']) ? $options['message'] : 'invalid';
-            $entity->errors($options['errorField'], (array)$message);
+            if ($name) {
+                $message = [$name => $message];
+            } else {
+                $message = (array)$message;
+            }
+            $entity->errors($options['errorField'], $message);
             return $pass;
         };
     }

+ 30 - 4
tests/TestCase/ORM/RulesCheckerIntegrationTest.php

@@ -280,6 +280,32 @@ class RulesCheckerIntegrationTest extends TestCase
     }
 
     /**
+     * Test adding rule with name
+     *
+     * @group save
+     * @return void
+     */
+    public function testAddingRuleWithName()
+    {
+        $entity = new Entity([
+            'name' => 'larry'
+        ]);
+
+        $table = TableRegistry::get('Authors');
+        $rules = $table->rulesChecker();
+        $rules->add(
+            function () {
+                return false;
+            },
+            'ruleName',
+            ['errorField' => 'name']
+        );
+
+        $this->assertFalse($table->save($entity));
+        $this->assertEquals(['ruleName' => 'invalid'], $entity->errors('name'));
+    }
+
+    /**
      * Tests the isUnique domain rule
      *
      * @group save
@@ -296,7 +322,7 @@ class RulesCheckerIntegrationTest extends TestCase
         $rules->add($rules->isUnique(['name']));
 
         $this->assertFalse($table->save($entity));
-        $this->assertEquals(['This value is already in use'], $entity->errors('name'));
+        $this->assertEquals(['_isUnique' => 'This value is already in use'], $entity->errors('name'));
 
         $entity->name = 'jose';
         $this->assertSame($entity, $table->save($entity));
@@ -324,7 +350,7 @@ class RulesCheckerIntegrationTest extends TestCase
         $rules->add($rules->isUnique(['title', 'author_id'], 'Nope'));
 
         $this->assertFalse($table->save($entity));
-        $this->assertEquals(['title' => ['Nope']], $entity->errors());
+        $this->assertEquals(['title' => ['_isUnique' => 'Nope']], $entity->errors());
 
         $entity->clean();
         $entity->author_id = 2;
@@ -350,7 +376,7 @@ class RulesCheckerIntegrationTest extends TestCase
         $rules->add($rules->existsIn('author_id', 'Authors'));
 
         $this->assertFalse($table->save($entity));
-        $this->assertEquals(['This value does not exist'], $entity->errors('author_id'));
+        $this->assertEquals(['_existsIn' => 'This value does not exist'], $entity->errors('author_id'));
     }
 
     /**
@@ -371,7 +397,7 @@ class RulesCheckerIntegrationTest extends TestCase
         $rules->add($rules->existsIn('author_id', TableRegistry::get('Authors'), 'Nope'));
 
         $this->assertFalse($table->save($entity));
-        $this->assertEquals(['Nope'], $entity->errors('author_id'));
+        $this->assertEquals(['_existsIn' => 'Nope'], $entity->errors('author_id'));
     }
 
     /**