8000 Merge remote branch 'kriswallsmith/templating/packages-rework' · DerekRoth/symfony@cb1f2c7 · GitHub
[go: up one dir, main page]

Skip to content

Commit cb1f2c7

Browse files
committed
Merge remote branch 'kriswallsmith/templating/packages-rework'
* kriswallsmith/templating/packages-rework: [FrameworkBundle] updated for templating changes, added http/ssl logic [Templating] reworked asset helper and packages
2 parents 06804d3 + d9f5c99 commit cb1f2c7

File tree

16 files changed

+628
-284
lines changed

16 files changed

+628
-284
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -179,21 +179,56 @@ private function addSessionSection(ArrayNodeDefinition $rootNode)
179179

180180
private function addTemplatingSection(ArrayNodeDefinition $rootNode)
181181
{
182+
$organizeUrls = function($urls)
183+
{
184+
$urls += array(
185+
'http' => array(),
186+
'ssl' => array(),
187+
);
188+
189+
foreach ($urls as $i => $url) {
190+
if (is_integer($i)) {
191+
if (0 === strpos($url, 'https://') || 0 === strpos($url, '//')) {
192+
$urls['http'][] = $urls['ssl'][] = $url;
193+
} else {
194+
$urls['http'][] = $url;
195+
}
196+
unset($urls[$i]);
197+
}
198+
}
199+
200+
return $urls;
201+
};
202+
182203
$rootNode
183204
->children()
184205
->arrayNode('templating')
185206
->canBeUnset()
186207
->children()
187208
->scalarNode('assets_version')->defaultValue(null)->end()
209+
->scalarNode('assets_version_format')->defaultValue(null)->end()
188210
->end()
189211
->fixXmlConfig('assets_base_url')
190212
->children()
191213
->arrayNode('assets_base_urls')
214+
->addDefaultsIfNotSet()
215+
->defaultValue(array('http' => array(), 'ssl' => array()))
192216
->beforeNormalization()
193-
->ifTrue(function($v){ return !is_array($v); })
194-
->then(function($v){ return array($v); })
217+
->ifTrue(function($v) { return !is_array($v); })
218+
->then(function($v) { return array($v); })
219+
->end()
220+
->beforeNormalization()
221+
->always()
222+
->then($organizeUrls)
223+
->end()
224+
->children()
225+
->arrayNode('http')
226+
->prototype('scalar')->end()
227+
->end()
228+
->arrayNode('ssl')
229+
->prototype('scalar')->end()
230+
->end()
195231
->end()
196-
->prototype('scalar')->end()
197232
->end()
198233
->scalarNode('cache')->end()
199234
->scalarNode('cache_warmer')->defaultFalse()->end()
@@ -228,8 +263,26 @@ private function addTemplatingSection(ArrayNodeDefinition $rootNode)
228263
->fixXmlConfig('base_url')
229264
->children()
230265
->scalarNode('version')->defaultNull()->end()
266+
->scalarNode('version_format')->defaultNull()->end()
231267
->arrayNode('base_urls')
232-
->prototype('scalar')->end()
268+
->addDefaultsIfNotSet()
269+
->defaultValue(array('http' => array(), 'ssl' => array()))
270+
->beforeNormalization()
271+
->ifTrue(function($v) { return !is_array($v); })
272+
->then(function($v) { return array($v); })
273+
->end()
274+
->beforeNormalization()
275+
->always()
276+
->then($organizeUrls)
277+
->end()
278+
->children()
279+
->arrayNode('http')
280+
->prototype('scalar')->end()
281+
->end()
282+
->arrayNode('ssl')
283+
->prototype('scalar')->end()
284+
->end()
285+
->end()
233286
->end()
234287
->end()
235288
->end()

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 79 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Symfony\Component\Config\Loader\LoaderInterface;
1515
use Symfony\Component\DependencyInjection\ContainerBuilder;
1616
use Symfony\Component\DependencyInjection\Definition;
17+
use Symfony\Component\DependencyInjection\DefinitionDecorator;
1718
use Symfony\Component\DependencyInjection\Parameter;
1819
use Symfony\Component\DependencyInjection\Reference;
1920
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
@@ -332,17 +333,19 @@ private function registerTemplatingConfiguration(array $config, $ide, ContainerB
332333
$loader->load('templating_debug.xml');
333334
}
334335

335-
$packages = array();
336+
// create package definitions and add them to the assets helper
337+
$defaultPackage = $this->createPackageDefinition($container, $config['assets_base_urls']['http'], $config['assets_base_urls']['ssl'], $config['assets_version'], $config['assets_version_format']);
338+
$container->setDefinition('templating.asset.default_package', $defaultPackage);
339+
$namedPackages = array();
336340
foreach ($config['packages'] as $name => $package) {
337-
$packages[$name] = new Definition('%templating.asset_package.class%', array(
338-
$package['base_urls'],
339-
$package['version'],
340-
));
341+
$namedPackage = $this->createPackageDefinition($container, $package['base_urls']['http'], $package['base_urls']['ssl'], $package['version'], $package['version_format'], $name);
342+
$container->setDefinition('templating.asset.package.'.$name, $namedPackage);
343+
$namedPackages[$name] = new Reference('templating.asset.package.'.$name);
341344
}
342-
343-
$container->setParameter('templating.helper.assets.assets_base_urls', isset($config['assets_base_urls']) ? $config['assets_base_urls'] : array());
344-
$container->setParameter('templating.helper.assets.assets_version', $config['assets_version']);
345-
$container->getDefinition('templating.helper.assets')->replaceArgument(3, $packages);
345+
$container->getDefinition('templating.helper.assets')->setArguments(array(
346+
new Reference('templating.asset.default_package'),
347+
$namedPackages,
348+
));
346349

347350
if (!empty($config['loaders'])) {
348351
$loaders = array_map(function($loader) { return new Reference($loader); }, $config['loaders']);
@@ -412,6 +415,73 @@ private function registerTemplatingConfiguration(array $config, $ide, ContainerB
412415
}
413416
}
414417

418+
/**
419+
* Returns a definition for an asset package.
420+
*/
421+
private function createPackageDefinition(ContainerBuilder $container, array $httpUrls, array $sslUrls, $version, $format, $name = null)
422+
{
423+
if (!$httpUrls) {
424+
$package = new DefinitionDecorator('templating.asset.path_package');
425+
$package
426+
->setPublic(false)
427+
->setScope('request')
428+
->replaceArgument(1, $version)
429+
->replaceArgument(2, $format)
430+
;
431+
432+
return $package;
433+
}
434+
435+
if ($httpUrls == $sslUrls) {
436+
$package = new DefinitionDecorator('templating.asset.url_package');
437+
$package
438+
->setPublic(false)
439+
->replaceArgument(0, $sslUrls)
440+
->replaceArgument(1, $version)
441+
->replaceArgument(2, $format)
442+
;
443+
444+
return $package;
445+
}
446+
447+
$prefix = $name ? 'templating.asset.package.'.$name : 'templating.asset.default_package';
448+
449+
$httpPackage = new DefinitionDecorator('templating.asset.url_package');
450+
$httpPackage
451+
->replaceArgument(0, $httpUrls)
452+
->replaceArgument(1, $version)
453+
->replaceArgument(2, $format)
454+
;
455+
$container->setDefinition($prefix.'.http', $httpPackage);
456+
457+
if ($sslUrls) {
458+
$sslPackage = new DefinitionDecorator('templating.asset.url_package');
459+
$sslPackage
460+
->replaceArgument(0, $sslUrls)
461+
->replaceArgument(1, $version)
462+
->replaceArgument(2, $format)
463+
;
464+
} else {
465+
$sslPackage = new DefinitionDecorator('templating.asset.path_package');
466+
$sslPackage
467+
->setScope('request')
468+
->replaceArgument(1, $version)
469+
->replaceArgument(2, $format)
470+
;
471+
}
472+
$container->setDefinition($prefix.'.ssl', $sslPackage);
473+
474+
$package = new DefinitionDecorator('templating.asset.request_aware_package');
475+
$package
476+
->setPublic(false)
477+
->setScope('request')
478+
->replaceArgument(1, $prefix.'.http')
479+
->replaceArgument(2, $prefix.'.ssl')
480+
;
481+
482+
return $package;
483+
}
484+
415485
/**
416486
* Loads the translator configuration.
417487
*

src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@
103103
</xsd:sequence>
104104

105105
<xsd:attribute name="assets-version" type="xsd:string" />
106+
<xsd:attribute name="assets-version-format" type="xsd:string" />
106107
<xsd:attribute name="cache" type="xsd:string" />
107108
<xsd:attribute name="cache-warmer" type="cache_warmer" />
108109
</xsd:complexType>
@@ -114,6 +115,7 @@
114115

115116
<xsd:attribute name="name" type="xsd:string" use="required" />
116117
<xsd:attribute name="version" type="xsd:string" />
118+
<xsd:attribute name="version-format" type="xsd:string" />
117119
</xsd:complexType>
118120

119121
<xsd:complexType name="translator">

src/Symfony/Bundle/FrameworkBundle/Resources/config/templating_php.xml

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<parameters>
88
<parameter key="templating.engine.php.class">Symfony\Bundle\FrameworkBundle\Templating\PhpEngine</parameter>
99
<parameter key="templating.helper.slots.class">Symfony\Component\Templating\Helper\SlotsHelper</parameter>
10-
<parameter key="templating.helper.assets.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\AssetsHelper</parameter>
10+
<parameter key="templating.helper.assets.class">Symfony\Component\Templating\Helper\CoreAssetsHelper</parameter>
1111
<parameter key="templating.helper.actions.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\ActionsHelper</parameter>
1212
<parameter key="templating.helper.router.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\RouterHelper</parameter>
1313
<parameter key="templating.helper.request.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\RequestHelper</parameter>
@@ -16,7 +16,9 @@
1616
<parameter key="templating.helper.translator.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\TranslatorHelper</parameter>
1717
<parameter key="templating.helper.form.class">Symfony\Bundle\FrameworkBundle\Templating\Helper\FormHelper</parameter>
1818
<parameter key="templating.globals.class">Symfony\Bundle\FrameworkBundle\Templating\GlobalVariables</parameter>
19-
<parameter key="templating.asset_package.class">Symfony\Component\Templating\Asset\AssetPackage</parameter>
19+
<parameter key="templating.asset.path_package.class">Symfony\Bundle\FrameworkBundle\Templating\Asset\PathPackage</parameter>
20+
<parameter key="templating.asset.url_package.class">Symfony\Component\Templating\Asset\UrlPackage</parameter>
21+
<parameter key="templating.asset.package_factory.class">Symfony\Bundle\FrameworkBundle\Templating\Asset\PackageFactory</parameter>
2022
</parameters>
2123

2224
<services>
@@ -32,12 +34,32 @@
3234
<tag name="templating.helper" alias="slots" />
3335
</service>
3436

35-
<service id="templating.helper.assets" class="%templating.helper.assets.class%">
37+
<service id="templating.helper.assets" class="%templating.helper.assets.class%" scope="request">
3638
<tag name="templating.helper" alias="assets" />
39+
<argument /> <!-- default package -->
40+
<argument type="collection" /> <!-- named packages -->
41+
</service>
42+
43+
<service id="templating.asset.path_package" class="%templating.asset.path_package.class%" abstract="true">
44+
<argument type="service" id="request" />
45+
<argument /> <!-- version -->
46+
<argument /> <!-- version format -->
47+
</service>
48+
49+
<service id="templating.asset.url_package" class="%templating.asset.url_package.class%" abstract="true">
50+
<argument /> <!-- base urls -->
51+
<argument /> <!-- version -->
52+
<argument /> <!-- version format -->
53+
</service>
54+
55+
<service id="templating.asset.request_aware_package" class="Symfony\Component\Templating\Asset\PackageInterface" factory-service="templating.asset.package_factory" factory-method="getPackage" abstract=< 10000 span class="pl-s">"true">
3756
<argument type="service" id="request" strict="false" />
38-
<argument>%templating.helper.assets.assets_base_urls%</argument>
39-
<argument>%templating.helper.assets.assets_version%</argument>
40-
<argument type="collection" /> <!-- packages -->
57+
<argument /> <!-- http id -->
58+
<argument /> <!-- ssl id -->
59+
</service>
60+
61+
<service id="templating.asset.package_factory" class="%templating.asset.package_factory.class%">
62+
<argument type="service" id="service_container" />
4163
</service>
4264

4365
<service id="templating.helper.request" class="%templating.helper.request.class%">
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Bundle\FrameworkBundle\Templating\Asset;
13+
14+
use Symfony\Component\DependencyInjection\ContainerInterface;
15+
use Symfony\Component\HttpFoundation\Request;
16+
17+
/**
18+
* Creates packages based on whether the current request is secure.
19+
*
20+
* @author Kris Wallsmith <kris@symfony.com>
21+
*/
22+
class PackageFactory
23+
{
24+
private $container;
25+
26+
public function __construct(ContainerInterface $container)
27+
{
28+
$this->container = $container;
29+
}
30+
31+
/**
32+
* Returns either the HTTP or SSL version of an asset package.
33+
*
34+
* @param Request $request The current request
35+
* @param string $httpId The id for the package to use when the current request is HTTP
36+
* @param string $sslId The id for the package to use when the current request is SSL
37+
*
38+
* @return PackageInterface The package
39+
*/
40+
public function getPackage(Request $request, $httpId, $sslId)
41+
{
42+
return $this->container->get($request->isSecure() ? $sslId : $httpId);
43+
}
44+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Bundle\FrameworkBundle\Templating\Asset;
13+
14+
use Symfony\Component\HttpFoundation\Request;
15+
use Symfony\Component\Templating\Asset\PathPackage as BasePathPackage;
16+
17+
/**
18+
* The path packages adds a version and a base path to asset URLs.
19+
*
20+
* @author Kris Wallsmith <kris@symfony.com>
21+
*/
22+
class PathPackage extends BasePathPackage
23+
{
24+
/**
25+
* Constructor.
26+
*
27+
* @param Request $request The current request
28+
* @param string $version The version
29+
* @param string $format The version format
30+
*/
31+
public function __construct(Request $request, $version = null, $format = null)
32+
{
33+
parent::__construct($request->getBasePath(), $version, $format);
34+
}
35+
}

src/Symfony/Bundle/FrameworkBundle/Templating/Helper/AssetsHelper.php

Lines changed: 0 additions & 36 deletions
This file was deleted.

0 commit comments

Comments
 (0)
0