Browse Source

Merge pull request #10720 from cakephp/3.next-fix-validation

Fixed a regression in ValidatorAwareTrait
José Lorenzo Rodríguez 8 years ago
parent
commit
885b56cff6

+ 8 - 0
src/ORM/Table.php

@@ -2708,6 +2708,14 @@ class Table implements RepositoryInterface, EventListenerInterface, EventDispatc
     }
 
     /**
+     * {@inheritDoc}
+     */
+    protected function validationMethodExists($method)
+    {
+        return method_exists($this, $method) || $this->behaviors()->hasMethod($method);
+    }
+
+    /**
      * Returns an array that can be used to describe the internal state of this
      * object.
      *

+ 13 - 2
src/Validation/ValidatorAwareTrait.php

@@ -163,7 +163,7 @@ trait ValidatorAwareTrait
     protected function createValidator($name)
     {
         $method = 'validation' . ucfirst($name);
-        if (!method_exists($this, $method)) {
+        if (!$this->validationMethodExists($method)) {
             $message = sprintf('The %s::%s() validation method does not exists.', __CLASS__, $method);
             throw new RuntimeException($message);
         }
@@ -216,7 +216,7 @@ trait ValidatorAwareTrait
     public function hasValidator($name)
     {
         $method = 'validation' . ucfirst($name);
-        if (method_exists($this, $method)) {
+        if ($this->validationMethodExists($method)) {
             return true;
         }
 
@@ -224,6 +224,17 @@ trait ValidatorAwareTrait
     }
 
     /**
+     * Checks if validation method exists.
+     *
+     * @param string $name Validation method name.
+     * @return bool
+     */
+    protected function validationMethodExists($name)
+    {
+        return method_exists($this, $name);
+    }
+
+    /**
      * Returns the default validator object. Subclasses can override this function
      * to add a default validation set to the validator object.
      *

+ 15 - 0
tests/TestCase/ORM/TableTest.php

@@ -3363,6 +3363,21 @@ class TableTest extends TestCase
     }
 
     /**
+     * Tests that there exists a validator defined in a behavior.
+     *
+     * @return void
+     */
+    public function testValidatorBehavior()
+    {
+        $table = new Table();
+        $table->addBehavior('Validation');
+
+        $validator = $table->getValidator('Behavior');
+        $set = $validator->field('name');
+        $this->assertTrue(isset($set['behaviorRule']));
+    }
+
+    /**
      * Tests that it is possible to define custom validator methods
      *
      * @return void

+ 35 - 0
tests/test_app/TestApp/Model/Behavior/ValidationBehavior.php

@@ -0,0 +1,35 @@
+<?php
+/**
+ * Behavior for binding management.
+ *
+ * Behavior to simplify manipulating a model's bindings when doing a find operation
+ *
+ * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
+ * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * For full copyright and license information, please see the LICENSE.txt
+ * Redistributions of files must retain the above copyright notice.
+ *
+ * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ * @link          http://cakephp.org CakePHP(tm) Project
+ * @since         3.5.0
+ * @license       http://www.opensource.org/licenses/mit-license.php MIT License
+ */
+namespace TestApp\Model\Behavior;
+
+use Cake\ORM\Behavior;
+use Cake\Validation\Validator;
+
+/**
+ * Description of ValidationBehavior
+ *
+ * @author Robert Pustułka <r.pustulka@robotusers.com>
+ */
+class ValidationBehavior extends Behavior
+{
+    public function validationBehavior(Validator $validator)
+    {
+        return $validator->add('name', 'behaviorRule');
+    }
+}