registerMinkDriver($extensionManager); } public function configure(ArrayNodeDefinition $builder): void { $builder ->addDefaultsIfNotSet() ->children() ->scalarNode('bootstrap')->defaultNull()->end() ->arrayNode('kernel') ->addDefaultsIfNotSet() ->children() ->scalarNode('path')->defaultNull()->end() ->scalarNode('class')->defaultNull()->end() ->scalarNode('environment')->defaultValue('test')->end() ->booleanNode('debug')->defaultTrue()->end() ->end() ->end() ->end() ; } public function load(ContainerBuilder $container, array $config): void { $container->setParameter('fob_symfony.bootstrap', $config['bootstrap']); $this->loadKernel($container, $this->autodiscoverKernelConfiguration($config['kernel'])); $this->loadDriverKernel($container); $this->loadKernelRebooter($container); $this->loadEnvironmentHandler($container); if ($this->minkExtensionFound) { $this->loadMinkDefaultSession($container); $this->loadMinkParameters($container); } } public function process(ContainerBuilder $container): void { $this->processBootstrap($this->autodiscoverBootstrap($container->getParameter('fob_symfony.bootstrap'))); } private function registerMinkDriver(ExtensionManager $extensionManager): void { /** @var MinkExtension|null $minkExtension */ $minkExtension = $extensionManager->getExtension('mink'); if (null === $minkExtension) { return; } $minkExtension->registerDriverFactory(new SymfonyDriverFactory('symfony', new Reference(self::DRIVER_KERNEL_ID))); $this->minkExtensionFound = true; } private function loadKernel(ContainerBuilder $container, array $config): void { $definition = new Definition($config['class'], [ $config['environment'], $config['debug'], ]); $definition->addMethodCall('boot'); $definition->setPublic(true); if ($config['path'] !== null) { $definition->setFile($config['path']); } $container->setDefinition(self::KERNEL_ID, $definition); } private function loadDriverKernel(ContainerBuilder $container): void { $container->setDefinition(self::DRIVER_KERNEL_ID, $container->findDefinition(self::KERNEL_ID)); } private function loadKernelRebooter(ContainerBuilder $container): void { $definition = new Definition(KernelOrchestrator::class, [new Reference(self::KERNEL_ID), $container]); $definition->addTag(EventDispatcherExtension::SUBSCRIBER_TAG); $container->setDefinition('fob_symfony.kernel_orchestrator', $definition); } private function loadEnvironmentHandler(ContainerBuilder $container): void { $definition = new Definition(ContextServiceEnvironmentHandler::class, [ new Reference(self::KERNEL_ID), ]); $definition->addTag(EnvironmentExtension::HANDLER_TAG, ['priority' => 128]); foreach ($container->findTaggedServiceIds(ContextExtension::INITIALIZER_TAG) as $serviceId => $tags) { $definition->addMethodCall('registerContextInitializer', [$container->getDefinition($serviceId)]); } $container->setDefinition('fob_symfony.environment_handler.context_service', $definition); } private function loadMinkDefaultSession(ContainerBuilder $container): void { $minkDefaultSessionDefinition = new Definition(Session::class); $minkDefaultSessionDefinition->setPublic(true); $minkDefaultSessionDefinition->setFactory([new Reference('mink'), 'getSession']); $container->setDefinition('fob_symfony.mink.default_session', $minkDefaultSessionDefinition); } private function loadMinkParameters(ContainerBuilder $container): void { $minkParametersDefinition = new Definition(MinkParameters::class, [new Parameter('mink.parameters')]); $minkParametersDefinition->setPublic(true); $container->setDefinition('fob_symfony.mink.parameters', $minkParametersDefinition); } private function autodiscoverKernelConfiguration(array $config): array { if ($config['class'] !== null) { return $config; } $autodiscovered = 0; if (class_exists('\App\Kernel')) { $config['class'] = '\App\Kernel'; ++$autodiscovered; } if (file_exists('app/AppKernel.php')) { $config['class'] = '\AppKernel'; $config['path'] = 'app/AppKernel.php'; ++$autodiscovered; } if ($autodiscovered !== 1) { throw new \RuntimeException( 'Could not autodiscover the application kernel. ' . 'Please define it manually with "FriendsOfBehat\SymfonyExtension.kernel" configuration option.' ); } return $config; } /** * @param string|bool|null $bootstrap */ private function autodiscoverBootstrap($bootstrap): ?string { if (is_string($bootstrap)) { return $bootstrap; } if ($bootstrap === false) { return null; } $autodiscovered = 0; if (file_exists('config/bootstrap.php')) { $bootstrap = 'config/bootstrap.php'; ++$autodiscovered; } if (file_exists('app/autoload.php')) { $bootstrap = 'app/autoload.php'; ++$autodiscovered; } if ($autodiscovered === 2) { throw new \RuntimeException( 'Could not autodiscover the bootstrap file. ' . 'Please define it manually with "FriendsOfBehat\SymfonyExtension.bootstrap" configuration option. ' . 'Setting that option to "false" disables autodiscovering.' ); } return is_string($bootstrap) ? $bootstrap : null; } private function processBootstrap(?string $bootstrap): void { if ($bootstrap === null) { return; } require_once $bootstrap; } }