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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions