diff --git a/composer.json b/composer.json index b125c3c..1336ef8 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,6 @@ ], "require": { "php": "^7.4 || ^8.0", - "laminas/laminas-mvc": "^3.2.0", "phpstan/phpstan": "^0.12.86" }, "conflict": { @@ -31,6 +30,7 @@ "laminas/laminas-inputfilter": "<2.12", "laminas/laminas-log": "<2.13", "laminas/laminas-mail": "<2.14", + "laminas/laminas-mvc": "<3.2", "laminas/laminas-paginator": "<2.10", "laminas/laminas-validator": "<2.14" }, @@ -43,10 +43,11 @@ "laminas/laminas-inputfilter": "^2.12.0", "laminas/laminas-log": "^2.13.1", "laminas/laminas-mail": "^2.14.0", + "laminas/laminas-mvc": "^3.2.0", "laminas/laminas-paginator": "^2.10.0", "laminas/laminas-validator": "^2.14.4", "malukenho/mcbumpface": "^1.1.5", - "phpstan/phpstan-phpunit": "^0.12.18", + "phpstan/phpstan-phpunit": "^0.12.19", "phpunit/phpunit": "^9.5.4", "slam/php-cs-fixer-extensions": "^v3.0.1", "slam/php-debug-r": "^v1.7.0" diff --git a/src/ServiceManagerLoader.php b/src/ServiceManagerLoader.php index 558a976..0e1ef27 100644 --- a/src/ServiceManagerLoader.php +++ b/src/ServiceManagerLoader.php @@ -5,11 +5,12 @@ namespace LaminasPhpStan; use Interop\Container\ContainerInterface as InteropContainerInterface; -use Laminas\ModuleManager\ModuleManager; +use Laminas\Mvc\Service\ServiceListenerFactory; use Laminas\Mvc\Service\ServiceManagerConfig; use Laminas\ServiceManager\ServiceLocatorInterface; use Laminas\ServiceManager\ServiceManager; use Psr\Container\ContainerInterface as PsrContainerInterface; +use ReflectionProperty; final class ServiceManagerLoader { @@ -19,17 +20,17 @@ final class ServiceManagerLoader * @var string[] */ private array $knownModules = [ - \Laminas\Cache\Module::class, - \Laminas\Filter\Module::class, - \Laminas\Form\Module::class, - \Laminas\Hydrator\Module::class, - \Laminas\I18n\Module::class, - \Laminas\InputFilter\Module::class, - \Laminas\Log\Module::class, - \Laminas\Mail\Module::class, - \Laminas\Paginator\Module::class, - \Laminas\Router\Module::class, - \Laminas\Validator\Module::class, + \Laminas\Cache\ConfigProvider::class, + \Laminas\Filter\ConfigProvider::class, + \Laminas\Form\ConfigProvider::class, + \Laminas\Hydrator\ConfigProvider::class, + \Laminas\I18n\ConfigProvider::class, + \Laminas\InputFilter\ConfigProvider::class, + \Laminas\Log\ConfigProvider::class, + \Laminas\Mail\ConfigProvider::class, + \Laminas\Paginator\ConfigProvider::class, + \Laminas\Router\ConfigProvider::class, + \Laminas\Validator\ConfigProvider::class, ]; /** @@ -63,20 +64,23 @@ public function __construct(?string $serviceManagerLoader) public function getServiceLocator(string $serviceManagerName): ServiceLocatorInterface { if (null === $this->serviceLocator) { - $serviceManagerConfig = new ServiceManagerConfig(); - $serviceManager = new ServiceManager(); - $serviceManagerConfig->configureServiceManager($serviceManager); - $config = [ - 'modules' => [], - 'module_listener_options' => [], - ]; + $serviceManager = new ServiceManager(['services' => ['config' => []]]); + if (\class_exists(ServiceManagerConfig::class)) { + (new ServiceManagerConfig())->configureServiceManager($serviceManager); + } + if (\class_exists(ServiceListenerFactory::class)) { + $refProp = new ReflectionProperty(ServiceListenerFactory::class, 'defaultServiceConfig'); + $refProp->setAccessible(true); + $config = $refProp->getValue(new ServiceListenerFactory()); + unset($config['factories']['config']); + $refProp->setAccessible(false); + $serviceManager->configure($config); + } foreach ($this->knownModules as $module) { if (\class_exists($module)) { - $config['modules'][$module] = new $module(); + $serviceManager->configure((new $module())->getDependencyConfig()); } } - $serviceManager->setService('ApplicationConfig', $config); - $serviceManager->get(ModuleManager::class)->loadModules(); $this->serviceLocator = new UnmappedAliasServiceLocatorProxy($serviceManager); }