An abstract service factory for the laminas/laminas-servicemanager and any other dependency injection container who's been able to handle it's config, like chubbyphp/chubbyphp-container via chubbyphp/chubbyphp-laminas-config and many (Aura.Di, Pimple, Auryn, Symfony, PHP-DI) more.
The original concept of this abstract service factory is by @DASPRiD used in dasprid/container-interop-doctrine which was handed over to roave/psr-container-doctrine.
Small adjustments and the possibility to use the concept as a basis for all service factories led me to make it available as an independent repository.
- php: ^8.1
- psr/container: ^2.0.2
Through Composer as chubbyphp/chubbyphp-laminas-config-factory.
composer require chubbyphp/chubbyphp-laminas-config-factory "^1.3"
<?php
declare(strict_types=1);
namespace MyProject\Factory;
use Chubbyphp\Laminas\Config\Factory\AbstractFactory;
use MyProject\Service\ServiceA;
use MyProject\Service\ServiceB;
use MyProject\Service\ServiceC;
use Psr\Container\ContainerInterface;
final class ServiceAFactory extends AbstractFactory
{
public function __invoke(ContainerInterface $container): ServiceA
{
return new ServiceA(
$this->resolveConfig($container->get('config')['serviceA'] ?? []),
$this->resolveDependency($container, ServiceB::class, ServiceBFactory::class),
$this->resolveDependency($container, ServiceC::class, ServiceCFactory::class)
);
}
}
/** @var ContainerInterface $container */
$container = ...;
// without name
$serviceA = (new ServiceAFactory())($container);
// with name
$serviceA = [ServiceAFactory::class, 'default']($container);
2024 Dominik Zogg