* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\DependencyInjection\Loader\Configurator; use Psr\Clock\ClockInterface as PsrClockInterface; use Psr\EventDispatcher\EventDispatcherInterface as PsrEventDispatcherInterface; use Symfony\Bundle\FrameworkBundle\CacheWarmer\ConfigBuilderCacheWarmer; use Symfony\Bundle\FrameworkBundle\HttpCache\HttpCache; use Symfony\Component\Clock\Clock; use Symfony\Component\Clock\ClockInterface; use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\Config\Resource\SelfCheckingResourceChecker; use Symfony\Component\Config\ResourceCheckerConfigCacheFactory; use Symfony\Component\Console\ConsoleEvents; use Symfony\Component\DependencyInjection\Config\ContainerParametersResourceChecker; use Symfony\Component\DependencyInjection\EnvVarProcessor; use Symfony\Component\DependencyInjection\ParameterBag\ContainerBag; use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\DependencyInjection\ReverseContainer; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\EventDispatcher\EventDispatcherInterface as EventDispatcherInterfaceComponentAlias; use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Form\FormEvents; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\HttpFoundation\UriSigner; use Symfony\Component\HttpFoundation\UrlHelper; use Symfony\Component\HttpKernel\CacheClearer\ChainCacheClearer; use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate; use Symfony\Component\HttpKernel\Config\FileLocator; use Symfony\Component\HttpKernel\DependencyInjection\ServicesResetter; use Symfony\Component\HttpKernel\EventListener\LocaleAwareListener; use Symfony\Component\HttpKernel\HttpCache\Store; use Symfony\Component\HttpKernel\HttpCache\StoreInterface; use Symfony\Component\HttpKernel\HttpKernel; use Symfony\Component\HttpKernel\HttpKernelInterface; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpKernel\KernelInterface; use Symfony\Component\Runtime\Runner\Symfony\HttpKernelRunner; use Symfony\Component\Runtime\Runner\Symfony\ResponseRunner; use Symfony\Component\Runtime\SymfonyRuntime; use Symfony\Component\String\LazyString; use Symfony\Component\String\Slugger\AsciiSlugger; use Symfony\Component\String\Slugger\SluggerInterface; use Symfony\Component\Workflow\WorkflowEvents; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; return static function (ContainerConfigurator $container) { // this parameter is used at compile time in RegisterListenersPass $container->parameters()->set('event_dispatcher.event_aliases', array_merge( class_exists(ConsoleEvents::class) ? ConsoleEvents::ALIASES : [], class_exists(FormEvents::class) ? FormEvents::ALIASES : [], KernelEvents::ALIASES, class_exists(WorkflowEvents::class) ? WorkflowEvents::ALIASES : [] )); $container->services() ->set('parameter_bag', ContainerBag::class) ->args([ service('service_container'), ]) ->alias(ContainerBagInterface::class, 'parameter_bag') ->alias(ParameterBagInterface::class, 'parameter_bag') ->set('event_dispatcher', EventDispatcher::class) ->public() ->tag('container.hot_path') ->tag('event_dispatcher.dispatcher', ['name' => 'event_dispatcher']) ->alias(EventDispatcherInterfaceComponentAlias::class, 'event_dispatcher') ->alias(EventDispatcherInterface::class, 'event_dispatcher') ->alias(PsrEventDispatcherInterface::class, 'event_dispatcher') ->set('http_kernel', HttpKernel::class) ->public() ->args([ service('event_dispatcher'), service('controller_resolver'), service('request_stack'), service('argument_resolver'), false, ]) ->tag('container.hot_path') ->tag('container.preload', ['class' => HttpKernelRunner::class]) ->tag('container.preload', ['class' => ResponseRunner::class]) ->tag('container.preload', ['class' => SymfonyRuntime::class]) ->alias(HttpKernelInterface::class, 'http_kernel') ->set('request_stack', RequestStack::class) ->public() ->alias(RequestStack::class, 'request_stack') ->set('http_cache', HttpCache::class) ->args([ service('kernel'), service('http_cache.store'), service('esi')->nullOnInvalid(), abstract_arg('options'), ]) ->tag('container.hot_path') ->set('http_cache.store', Store::class) ->args([ param('kernel.cache_dir').'/http_cache', ]) ->alias(StoreInterface::class, 'http_cache.store') ->set('url_helper', UrlHelper::class) ->args([ service('request_stack'), service('router')->ignoreOnInvalid(), ]) ->alias(UrlHelper::class, 'url_helper') ->set('cache_warmer', CacheWarmerAggregate::class) ->public() ->args([ tagged_iterator('kernel.cache_warmer'), param('kernel.debug'), sprintf('%s/%sDeprecations.log', param('kernel.build_dir'), param('kernel.container_class')), ]) ->tag('container.no_preload') ->set('cache_clearer', ChainCacheClearer::class) ->args([ tagged_iterator('kernel.cache_clearer'), ]) ->set('kernel') ->synthetic() ->public() ->alias(KernelInterface::class, 'kernel') ->set('filesystem', Filesystem::class) ->alias(Filesystem::class, 'filesystem') ->set('file_locator', FileLocator::class) ->args([ service('kernel'), ]) ->alias(FileLocator::class, 'file_locator') ->set('uri_signer', UriSigner::class) ->args([ param('kernel.secret'), ]) ->alias(UriSigner::class, 'uri_signer') ->set('config_cache_factory', ResourceCheckerConfigCacheFactory::class) ->args([ tagged_iterator('config_cache.resource_checker'), ]) ->set('dependency_injection.config.container_parameters_resource_checker', ContainerParametersResourceChecker::class) ->args([ service('service_container'), ]) ->tag('config_cache.resource_checker', ['priority' => -980]) ->set('config.resource.self_checking_resource_checker', SelfCheckingResourceChecker::class) ->tag('config_cache.resource_checker', ['priority' => -990]) ->set('services_resetter', ServicesResetter::class) ->public() ->set('reverse_container', ReverseContainer::class) ->args([ service('service_container'), service_locator([]), ]) ->alias(ReverseContainer::class, 'reverse_container') ->set('locale_aware_listener', LocaleAwareListener::class) ->args([ [], // locale aware services service('request_stack'), ]) ->tag('kernel.event_subscriber') ->set('container.env_var_processor', EnvVarProcessor::class) ->args([ service('service_container'), tagged_iterator('container.env_var_loader'), ]) ->tag('container.env_var_processor') ->set('slugger', AsciiSlugger::class) ->args([ param('kernel.default_locale'), ]) ->tag('kernel.locale_aware') ->alias(SluggerInterface::class, 'slugger') ->set('container.getenv', \Closure::class) ->factory([\Closure::class, 'fromCallable']) ->args([ [service('service_container'), 'getEnv'], ]) ->tag('routing.expression_language_function', ['function' => 'env']) ->set('container.get_routing_condition_service', \Closure::class) ->public() ->factory([\Closure::class, 'fromCallable']) ->args([ [tagged_locator('routing.condition_service', 'alias'), 'get'], ]) ->tag('routing.expression_language_function', ['function' => 'service']) // inherit from this service to lazily access env vars ->set('container.env', LazyString::class) ->abstract() ->factory([LazyString::class, 'fromCallable']) ->args([ service('container.getenv'), ]) ->set('config_builder.warmer', ConfigBuilderCacheWarmer::class) ->args([service(KernelInterface::class), service('logger')->nullOnInvalid()]) ->tag('kernel.cache_warmer') ->set('clock', Clock::class) ->alias(ClockInterface::class, 'clock') ->alias(PsrClockInterface::class, 'clock') // register as abstract and excluded, aka not-autowirable types ->set(LoaderInterface::class)->abstract()->tag('container.excluded') ->set(Request::class)->abstract()->tag('container.excluded') ->set(Response::class)->abstract()->tag('container.excluded') ->set(SessionInterface::class)->abstract()->tag('container.excluded') ; };