rule = $rule; $this->name = $name; $this->options = $options; } /** * Set options for the rule invocation. * * Old options will be merged with the new ones. * * @param array $options The options to set. * @return $this */ public function setOptions(array $options) { $this->options = $options + $this->options; return $this; } /** * Set the rule name. * * Only truthy names will be set. * * @param string $name The name to set. * @return $this */ public function setName($name) { if ($name) { $this->name = $name; } return $this; } /** * Invoke the rule. * * @param \Cake\Datasource\EntityInterface $entity The entity the rule * should apply to. * @param array $scope The rule's scope/options. * @return bool Whether or not the rule passed. */ public function __invoke($entity, $scope) { $rule = $this->rule; $pass = $rule($entity, $this->options + $scope); if ($pass === true || empty($this->options['errorField'])) { return $pass === true; } $message = 'invalid'; if (isset($this->options['message'])) { $message = $this->options['message']; } if (is_string($pass)) { $message = $pass; } if ($this->name) { $message = [$this->name => $message]; } else { $message = [$message]; } $errorField = $this->options['errorField']; $entity->setError($errorField, $message); if ($entity instanceof InvalidPropertyInterface && isset($entity->{$errorField})) { $invalidValue = $entity->{$errorField}; $entity->setInvalidField($errorField, $invalidValue); } return $pass === true; } }