Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Cannot set an enum as argument in services.php #50275

Closed
@ludekbenedik

Description

@ludekbenedik

Symfony version(s) affected

5.4.23

Description

Although Symfony 5.4 allows set an enum as an argument in DI Definition, it is not possible set the enum as the argument in Configurator.

Works:

protected function build(ContainerBuilder $container)
{
    $container->register(MyService::class)
        ->setPublic(true)
        ->setArgument('$myEnum', MyEnum::First)
    ;
}

Not works:

return static function (ContainerConfigurator $configurator): void {
    $configurator->services()->set(MyService::class)
        ->public()
        ->arg('$myEnum', MyEnum::First)
    ;
};

Throws: Cannot use values of type "App\Service\MyEnum" in service configuration files.

How to reproduce

config/services.php

$configurator->services()->set(MyService::class)
    ->arg('$myEnum', MyEnum::First)
;

src/Service/MyEnum.php

<?php

namespace App\Service;

enum MyEnum: string
{
    case First = 'first';
    case Second = 'second';
}

src/Service/MyService.php

<?php

namespace App\Service;

class MyService
{
    public function __construct(MyEnum $myEnum)
    {
    }
}

Possible Solution

Symfony\Component\DependencyInjection\Loader\Configurator\AbstractConfigurator::processValue

Line 102

Replace

case null === $value:
case \is_scalar($value):
    return $value;

by

case null === $value:
case \is_scalar($value):
case $value instanceof \UnitEnum:
    return $value;

Additional Context

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions