laminas-servicemanager icon indicating copy to clipboard operation
laminas-servicemanager copied to clipboard

Psalm types do not allow the use of static factories

Open gsteel opened this issue 5 months ago • 0 comments

Bug Report

Q A
Version(s) 4.x

Summary

I often create what I call "static factories" along the lines of

class SomeFactory {
    public function __construct(private string $key) {
    }

    public static function __callStatic(string $method, array $arguments): Whatever
    {
        $container = $arguments[0] ?? null;
        assert($container instanceof ContainerInterface);

        return (new self($method))->__invoke($container);
    }

    public function __invoke(ContainerInterface $container): Whatever
    {
        $config = $this->key;
        
        return new Whatever(
            $container->get(SomeDependency::class)
            $config,
        );
    }
}

and then refer to these in config as:

return [
    'factories' => [
        Whatever::class => [SomeFactory::class, 'some-key'],
    ],
];

Current behavior

Adding callables like this is causing SA issues in projects

Expected behavior

No SA issues listing regular callables

Can we simply add callable to the psalm-type unions on ServiceManager for factories, delegators etc?

gsteel avatar Sep 18 '24 22:09 gsteel