Skip to content

Conditional filtering #54

@vova07

Description

@vova07

Hi there again,
Thanks for nice filter tool.

Will try to be short, here is my problem:

What

$validator = new Validator();
$validator->required('title')->string()->lengthBetween(0, 255);
$validator->optional('slug')->string()->lengthBetween(0, 255);

$filter = new Filter();
$filter->value('slug')->slug('title');

$data = [
  'title' => 'Test title',
  'slug' => 'test-slug',
];

$result = $validator->validate($data);
$values = $filter->filter($result->getValues());

var_dump($values);

/*
[
  'title' => 'Test title',
  'slug' => 'testslug'
]

'slug' => 'testslug' instead of 'slug' => 'test-slug' because slug filter is call any time even if `slug` value is set.
*/

What is expected

$validator = new Validator();
$validator->required('title')->string()->lengthBetween(0, 255);
$validator->optional('slug')->string()->lengthBetween(0, 255);

$filter = new Filter();
$filter->value('slug')->skip(function ($value) { return !empty($value); })->slug('title');

$data = [
  'title' => 'Test title',
  'slug' => 'test-slug',
];

$result = $validator->validate($data);
$values = $filter->filter($result->getValues());

var_dump($values);

/*
[
  'title' => 'Test title',
  'slug' => 'test-slug'
]
*/

My suggestion is to add something that will give a possibility to skip filtering when value for filtered key is set, or maybe for any condition.
I know that filter is call to filter, but without own code we cannot obtain wondered behavior.

If I miss something please share a link to solution.

Thanks!

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions