Hello
I searched for a similar topic but I didn't find any... so I hope it won't be redundant. I have an "issue" (or, at least, a comprehension issue) with the initialization of the variable $validator in the CodeIgniter\Controller class.
Let me explain:
- I extended the CodeIgniter\Validation\Validation class with additional methods:
PHP Code:
<?php namespace App\Libraries;
use CodeIgniter\Validation\Validation as CoreValidation;
class Validation extends CoreValidation
{
public function __construct(\Config\Validation $config, \CodeIgniter\View\RendererInterface $view)
{
parent::__construct($config, $view);
}
/** ... my custom code here **/
}
?>
- I rewrote the validation() method in the Config\Services class to instanciate my custom class (as written in the user guide):
PHP Code:
public static function validation(\Config\Validation $config = null, bool $getShared = true)
{
if ($getShared)
{
return static::getSharedInstance('validation', $config);
}
if (is_null($config))
{
$config = config('Validation');
}
return new \App\Libraries\Validation($config, static::renderer());
}
,
- in my custom controller, I use the method validate() from the class CodeIgniter\Controller. For information, this method initializes the variable $validator:
PHP Code:
protected function validate($rules, array $messages = []): bool
{
$this->validator = Services::validation();
// If you replace the $rules array with the name of the group
if (is_string($rules))
{
$validation = new \Config\Validation();
// If the rule wasn't found in the \Config\Validation, we
// should throw an exception so the developer can find it.
if (! isset($validation->$rules))
{
throw ValidationException::forRuleNotFound($rules);
}
// If no error message is defined, use the error message in the Config\Validation file
if (! $messages)
{
$errorName = $rules . '_errors';
$messages = $validation->$errorName ?? [];
}
$rules = $validation->$rules;
}
$success = $this->validator
->withRequest($this->request)
->setRules($rules, $messages)
->run();
return $success;
}
What I expect: the variable $validator is an instance of my custom Validation class.
What I get: the variable is an instance of CodeIgniter\Config\Services.
Knowing the philosophy of the framework and the extensibility it provides, it seems to be bug. If not, could it be clearly stated when CodeIgniter\Config\Services is preferred to App\Config\Services? At leas to know when we can rely on our custom extensions of CI.
If it is done on purpose, obviously, I'll rewrite the validate method in my custom Controller.
Regards and thank you!