Version
5.9.2
Description
When using Assert\Choice with a callback parameter on a property in an abstract class, Nelmio API Doc Bundle throws a fatal error during documentation generation.
Error Message:
call_user_func(): Argument #1 ($callback) must be a valid callback, cannot call abstract method App\Entity\AbstractAuthor::getGenres()
Reproduction Steps:
- Create an abstract entity class with an
Assert\Choice constraint using a callback:
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
abstract class AbstractAuthor
{
#[Assert\Choice(callback: 'getGenres')]
protected string $genre;
public static function getGenres(): array
{
return ['fiction', 'non-fiction'];
}
}
- Run Nelmio API Doc Bundle's documentation generation (e.g.,
php bin/console api:openapi:export)
- The error occurs in the callback resolution logic
Root Cause:
The issue is in the callback resolution code that attempts to invoke call_user_func() on an abstract class:
\call_user_func(\is_array($choice->callback) ? $choice->callback : [$reflection->class, $choice->callback]);
Since $reflection->class is an abstract class, call_user_func() cannot instantiate it to invoke the method.
Expected Behavior:
Nelmio should gracefully handle abstract classes by either:
- Skipping callback resolution for abstract classes
- Attempting to resolve the callback on concrete subclasses
- Falling back to a sensible default or warning
Actual Behavior:
A fatal error is thrown, preventing documentation generation.
Workaround:
Currently, the only workaround is to use hardcoded choices instead of a callback or move the constraint to concrete subclasses:
#[Assert\Choice(choices: ['fiction', 'non-fiction'])]
protected string $genre;
or
abstract class AbstractAuthor
{
protected string $genre;
}
class ConcreteAuthor extends AbstractAuthor
{
#[Assert\Choice(callback: 'getGenres')]
protected string $genre;
public static function getGenres(): array
{
return ['fiction', 'non-fiction'];
}
}
JSON OpenApi
N/A
Additional context
This issue affects any abstract entity class using Assert\Choice with callbacks, which is a common pattern when sharing validation constraints across multiple concrete subclasses.
Version
5.9.2
Description
When using
Assert\Choicewith a callback parameter on a property in an abstract class, Nelmio API Doc Bundle throws a fatal error during documentation generation.Error Message:
Reproduction Steps:
Assert\Choiceconstraint using a callback:php bin/console api:openapi:export)Root Cause:
The issue is in the callback resolution code that attempts to invoke
call_user_func()on an abstract class:Since
$reflection->classis an abstract class,call_user_func()cannot instantiate it to invoke the method.Expected Behavior:
Nelmio should gracefully handle abstract classes by either:
Actual Behavior:
A fatal error is thrown, preventing documentation generation.
Workaround:
Currently, the only workaround is to use hardcoded choices instead of a callback or move the constraint to concrete subclasses:
or
JSON OpenApi
N/A
Additional context
This issue affects any abstract entity class using
Assert\Choicewith callbacks, which is a common pattern when sharing validation constraints across multiple concrete subclasses.