Skip to content

Bug: Validation passes if key does not exist when using asterisk #8006

Open
@puwnd

Description

@puwnd

PHP Version

8.1

CodeIgniter4 Version

4.4.1 OR 4.3.5

CodeIgniter4 Installation Method

Composer (using codeigniter4/appstarter)

Which operating systems have you tested for this bug?

Linux

Which server did you use?

apache

Database

No response

What happened?

If I use the asterisk in the validation rule, it does not check for non existing key.
There are two workarounds, but I guess they are not the best solutions.

  1. Add a default value with the given key
  2. Use with numbers instead of asterisk

Steps to Reproduce

In any controller I use the following snippet in the initController method.

        <?php
        $requestData = [
            'contacts' => [
                'friends' => [
                    ['name' => 'Fred Flinstone', 'age' => 20],
                    ['age' => 21], // 'name' key does not exist
                ]
            ]
        ];

        // $requestData['contacts']['friends'][1]['name'] ??= null; // Workaround for non existing keys

        $this->validator = Services::validation();
        $this->validator->setRules(
            [
                'contacts.friends.*.name' => 'required', // The "*" does not check for non existing keys and pass validation
                // 'contacts.friends.0.name' => 'required', // With this solution works fine even if the key does not exist
                // 'contacts.friends.1.name' => 'required', // With this solution works fine even if the key does not exist
            ]
        );

        dd($this->validator->run($requestData), $this->validator->getErrors());

Expected Output

I think the validation should check for it and fail if key does not exist (if there is a rule for it). So in my case the output should be:

$this->validator->run(...) boolean false
$this->validator->getErrors() array (1)
contacts.friends.1.name => string (46) "The contacts.friends.*.name field is required."

Now I get this:
$this->validator->run(...) boolean true
$this->validator->getErrors() array (0)

Anything else?

I did not see any reference in the documentation: https://codeigniter.com/user_guide/libraries/validation.html#setting-rules-for-array-data
I did not find any issue like this (maybe in the closed issues).

Metadata

Metadata

Assignees

Labels

bugVerified issues on the current code behavior or pull requests that will fix them

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions