Skip to content

Commit

Permalink
[Twig] Move configuration to PHP
Browse files Browse the repository at this point in the history
  • Loading branch information
fabpot committed May 10, 2020
1 parent 3acc28f commit 92b333a
Show file tree
Hide file tree
Showing 9 changed files with 214 additions and 228 deletions.
Expand Up @@ -15,7 +15,7 @@
use Symfony\Component\Config\Resource\FileExistenceResource;
use Symfony\Component\Console\Application;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\Mailer\Mailer;
Expand All @@ -34,19 +34,19 @@ class TwigExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
$loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('twig.xml');
$loader = new PhpFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('twig.php');

if (class_exists('Symfony\Component\Form\Form')) {
$loader->load('form.xml');
$loader->load('form.php');
}

if (class_exists(Application::class)) {
$loader->load('console.xml');
$loader->load('console.php');
}

if (class_exists(Mailer::class)) {
$loader->load('mailer.xml');
$loader->load('mailer.php');
}

if (!class_exists(Translator::class)) {
Expand Down
24 changes: 24 additions & 0 deletions src/Symfony/Bundle/TwigBundle/Resources/config/console.php
@@ -0,0 +1,24 @@
<?php

use Symfony\Bridge\Twig\Command\DebugCommand;
use Symfony\Bundle\TwigBundle\Command\LintCommand;
use Symfony\Component\DependencyInjection\Loader\Configurator as di;

return static function (di\ContainerConfigurator $container) {
$container->services()->defaults()->private()

This comment has been minimized.

Copy link
@Tobion

Tobion May 10, 2020

this shouldn't be needed anymore as it's the default since sf 4

This comment has been minimized.

Copy link
@fabpot

fabpot May 10, 2020

Author Owner

removed


->set('twig.command.debug', DebugCommand::class)
->args([
di\ref('twig'),
'%kernel.project_dir%',

This comment has been minimized.

Copy link
@Tobion

Tobion May 10, 2020

how about a new di\param function: di\param('kernel.project_dir')? more semantic conveying the meaning

This comment has been minimized.

Copy link
@fabpot

fabpot May 10, 2020

Author Owner

done

'%kernel.bundles_metadata%',
'%twig.default_path%',
di\ref('debug.file_link_formatter')->nullOnInvalid(),
])
->tag('console.command', ['command' => 'debug:twig'])

->set('twig.command.lint', LintCommand::class)
->args([di\ref('twig')])
->tag('console.command', ['command' => 'lint:twig'])
;
};
24 changes: 0 additions & 24 deletions src/Symfony/Bundle/TwigBundle/Resources/config/console.xml

This file was deleted.

21 changes: 21 additions & 0 deletions src/Symfony/Bundle/TwigBundle/Resources/config/form.php
@@ -0,0 +1,21 @@
<?php

use Symfony\Bridge\Twig\Extension\FormExtension;
use Symfony\Bridge\Twig\Form\TwigRendererEngine;
use Symfony\Component\DependencyInjection\Loader\Configurator as di;
use Symfony\Component\Form\FormRenderer;

return static function (di\ContainerConfigurator $container) {
$container->services()->defaults()->private()

->set('twig.extension.form', FormExtension::class)
->args([[di\ref('service_container'), 'twig.form.renderer']])

This comment has been minimized.

Copy link
@Tobion

Tobion May 10, 2020

i think it's hard to read. maybe we can agree to specific args always using multiple lines like above in console.php.

This comment has been minimized.

Copy link
@Tobion

Tobion May 10, 2020

the arguments are wrong btw: symfony#36777


->set('twig.form.engine', TwigRendererEngine::class)
->args(['%twig.form.resources%', di\ref('twig')])

->set('twig.form.renderer', FormRenderer::class)
->args([di\ref('twig.form.engine', di\ref('security.csrf.token_manager')->nullOnInvalid())])
->tag('twig.runtime')
;
};
27 changes: 0 additions & 27 deletions src/Symfony/Bundle/TwigBundle/Resources/config/form.xml

This file was deleted.

17 changes: 17 additions & 0 deletions src/Symfony/Bundle/TwigBundle/Resources/config/mailer.php
@@ -0,0 +1,17 @@
<?php

use Symfony\Bridge\Twig\Mime\BodyRenderer;
use Symfony\Component\DependencyInjection\Loader\Configurator as di;
use Symfony\Component\Mailer\EventListener\MessageListener;

return static function (di\ContainerConfigurator $container) {
$container->services()->defaults()->private()

->set('twig.mailer.message_listener', MessageListener::class)
->args([null, di\ref('twig.mime_body_renderer')])
->tag('kernel.event_subscriber')

->set('twig.mime_body_renderer', BodyRenderer::class)
->args([di\ref('twig')])
;
};
18 changes: 0 additions & 18 deletions src/Symfony/Bundle/TwigBundle/Resources/config/mailer.xml

This file was deleted.

146 changes: 146 additions & 0 deletions src/Symfony/Bundle/TwigBundle/Resources/config/twig.php
@@ -0,0 +1,146 @@
<?php

use Symfony\Bridge\Twig\AppVariable;
use Symfony\Bridge\Twig\DataCollector\TwigDataCollector;
use Symfony\Bridge\Twig\ErrorRenderer\TwigErrorRenderer;
use Symfony\Bridge\Twig\Extension\AssetExtension;
use Symfony\Bridge\Twig\Extension\CodeExtension;
use Symfony\Bridge\Twig\Extension\ExpressionExtension;
use Symfony\Bridge\Twig\Extension\HttpFoundationExtension;
use Symfony\Bridge\Twig\Extension\HttpKernelExtension;
use Symfony\Bridge\Twig\Extension\HttpKernelRuntime;
use Symfony\Bridge\Twig\Extension\ProfilerExtension;
use Symfony\Bridge\Twig\Extension\RoutingExtension;
use Symfony\Bridge\Twig\Extension\StopwatchExtension;
use Symfony\Bridge\Twig\Extension\TranslationExtension;
use Symfony\Bridge\Twig\Extension\WebLinkExtension;
use Symfony\Bridge\Twig\Extension\WorkflowExtension;
use Symfony\Bridge\Twig\Extension\YamlExtension;
use Symfony\Bridge\Twig\Translation\TwigExtractor;
use Symfony\Bundle\TwigBundle\CacheWarmer\TemplateCacheWarmer;
use Symfony\Bundle\TwigBundle\DependencyInjection\Configurator\EnvironmentConfigurator;
use Symfony\Bundle\TwigBundle\TemplateIterator;
use Symfony\Component\DependencyInjection\Loader\Configurator as di;
use Twig\Environment;
use Twig\Extension\DebugExtension;
use Twig\Loader\ChainLoader;
use Twig\Loader\FilesystemLoader;
use Twig\Profiler\Profile;
use Twig\RuntimeLoader\ContainerRuntimeLoader;

return static function (di\ContainerConfigurator $container) {
$container->services()->defaults()->private()

->set('twig', Environment::class)
->public()
->args([di\ref('twig.loader'), null /* Twig options */])
->call('addGlobal', ['app', di\ref('twig.app_variable')])
->call('addRuntimeLoader', [di\ref('twig.runtime_loader')])
->configurator([di\ref('twig.configurator.environment'), 'configure'])
->tag('container.preload', ['class' => 'Twig\Cache\FilesystemCache'])
->tag('container.preload', ['class' => 'Twig\Extension\CoreExtension'])
->tag('container.preload', ['class' => 'Twig\Extension\EscaperExtension'])
->tag('container.preload', ['class' => 'Twig\Extension\OptimizerExtension'])
->tag('container.preload', ['class' => 'Twig\Extension\StagingExtension'])
->tag('container.preload', ['class' => 'Twig\ExtensionSet'])
->tag('container.preload', ['class' => 'Twig\Template'])
->tag('container.preload', ['class' => 'Twig\TemplateWrapper'])

->alias('\Twig_Environment', 'twig')

This comment has been minimized.

Copy link
@nicolas-grekas

nicolas-grekas May 10, 2020

leading \ should be removed

This comment has been minimized.

Copy link
@fabpot

fabpot May 10, 2020

Author Owner

done

->alias(Environment::class, 'twig')

->set('twig.app_variable', AppVariable::class)
->call('setEnvironment', ['%kernel.environment%'])
->call('setDebug', ['%kernel.debug%'])
->call('setTokenStorage', [di\ref('security.token_storage')->ignoreOnInvalid()])
->call('setRequestStack', [di\ref('request_stack')->ignoreOnInvalid()])

->set('twig.template_iterator', TemplateIterator::class)
->args([di\ref('kernel'), [] /* Twig paths */, '%twig.default_path%'])

->set('twig.template_cache_warmer', TemplateCacheWarmer::class)
->args([di\ref('Psr\Container\ContainerInterface'), di\ref('twig.template_iterator')])
->tag('kernel.cache_warmer')
->tag('container.service_subscriber', ['id' => 'twig'])

->set('twig.loader.native_filesystem', FilesystemLoader::class)
->args([[] /* paths */, '%kernel.project_dir%'])
->tag('twig.loader')

->set('twig.loader.chain', ChainLoader::class)

->set('twig.extension.profiler', ProfilerExtension::class)
->args([di\ref('twig.profile'), di\ref('debug.stopwatch')->ignoreOnInvalid()])

->set('twig.profile', Profile::class)

->set('data_collector.twig', TwigDataCollector::class)
->args([di\ref('twig.profile'), di\ref('twig')])
->tag('data_collector', ['template' => '@WebProfiler/Collector/twig.html.twig', 'id' => 'twig', 'priority' => 257])

->set('twig.extension.trans', TranslationExtension::class)
->args([di\ref('translation')->nullOnInvalid()])
->tag('twig.extension')

->set('twig.extension.assets', AssetExtension::class)
->args([di\ref('assets.package')])

->set('twig.extension.code', CodeExtension::class)
->args([di\ref('debug.file_link_formatter')->ignoreOnInvalid(), '%kernel.project_dir%', '%kernel.charset%'])
->tag('twig.extension')

->set('twig.extension.routing', RoutingExtension::class)
->args([di\ref('router')])

->set('twig.extension.yaml', YamlExtension::class)

->set('twig.extension.debug.stopwatch', StopwatchExtension::class)
->args([di\ref('debug.stopwatch')->ignoreOnInvalid(), '%kernel.debug%'])

->set('twig.extension.expression', ExpressionExtension::class)

->set('twig.extension.httpkernel', HttpKernelExtension::class)

->set('twig.runtime.httpkernel', HttpKernelRuntime::class)
->args([di\ref('fragment.handler')])

->set('twig.extension.httpfoundation', HttpFoundationExtension::class)
->args([di\ref('url_helper')])

->set('twig.extension.debug', DebugExtension::class)

->set('twig.extension.weblink', WebLinkExtension::class)
->args([di\ref('request_stack')])

->set('twig.translation.extractor', TwigExtractor::class)
->args([di\ref('twig')])
->tag('translation.extractor', ['alias' => 'twig'])

->set('workflow.twig_extension', WorkflowExtension::class)
->args([di\ref('workflow.registry')])

->set('twig.configurator.environment', EnvironmentConfigurator::class)
->args([
'', /* date format, set in TwigExtension */

This comment has been minimized.

Copy link
@nicolas-grekas

nicolas-grekas May 10, 2020

could use new AbstractArgument('date format expected to be set in TwigExtension')

This comment has been minimized.

Copy link
@fabpot

fabpot May 10, 2020

Author Owner

That would be the only 'new XXX()', can we add a function for that as well?

This comment has been minimized.

Copy link
@nicolas-grekas

nicolas-grekas May 10, 2020

sure, abstract_arg() in src/Symfony/Component/DependencyInjection/Loader/Configurator/ContainerConfigurator.php could do it

This comment has been minimized.

Copy link
@fabpot

This comment has been minimized.

Copy link
@fabpot

fabpot May 10, 2020

Author Owner

Fixed now

'', /* interval format, set in TwigExtension */
'', /* timezone, set in TwigExtension */
'', /* decimals, set in TwigExtension */
'', /* decimal point, set in TwigExtension */
'', /* thousands separator, set in TwigExtension */
])

->set('twig.runtime_loader', ContainerRuntimeLoader::class)
->args(['' /* runtime locator */])

->set('twig.error_renderer.html', TwigErrorRenderer::class)
->decorate('error_renderer.html')
->args([
di\ref('twig'),
di\ref('twig.error_renderer.html.inner'),
di\service(TwigErrorRenderer::class)
->factory([TwigErrorRenderer::class, 'isDebug'])
->args([di\ref('request_stack'), '%kernel.debug%']),
])

;
};

0 comments on commit 92b333a

Please sign in to comment.