Skip to content

Commit ecb3a4b

Browse files
committed
we need tests!
1 parent 91ef3a4 commit ecb3a4b

File tree

11 files changed

+180
-340
lines changed

11 files changed

+180
-340
lines changed

AssetsBundle/DependencyInjection/Configuration.php

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,32 +16,26 @@ class Configuration implements ConfigurationInterface
1616
*/
1717
public function getConfigTreeBuilder()
1818
{
19-
$treeBuilder = new TreeBuilder();
20-
$rootNode = $treeBuilder->root('docplanner_assets');
19+
$treeBuilder = new TreeBuilder;
20+
$nodeBuilder = $treeBuilder->root('docplanner_assets')->children();
2121

22-
$nodeBuilder = $rootNode->children();
23-
$this->addBaseNode($nodeBuilder)
24-
->addNode($nodeBuilder, 'style')
25-
->addNode($nodeBuilder, 'script');
26-
27-
// Here you should define the parameters that are allowed to
28-
// configure your bundle. See the documentation linked above for
29-
// more information on that topic.
22+
$this->addOptions($nodeBuilder)
23+
->addTypes($nodeBuilder);
3024

3125
return $treeBuilder;
3226
}
3327

3428
/**
3529
* @param NodeBuilder $node
36-
* @param string $name
3730
*
3831
* @return $this
3932
*/
40-
public function addNode(NodeBuilder $node, $name)
33+
public function addTypes(NodeBuilder $node)
4134
{
4235
// @formatter:off
4336
/** @noinspection PhpUndefinedMethodInspection */
44-
$node->arrayNode($name)
37+
$node->arrayNode('types')
38+
->prototype('array')
4539
->addDefaultsIfNotSet()
4640
->children()
4741
->arrayNode('assets')
@@ -76,8 +70,9 @@ public function addNode(NodeBuilder $node, $name)
7670
->end()
7771
->end()
7872
->end()
79-
->end();
80-
// @formatter:on
73+
->end()
74+
->end();
75+
// @formatter:on
8176

8277
return $this;
8378
}
@@ -87,20 +82,19 @@ public function addNode(NodeBuilder $node, $name)
8782
*
8883
* @return $this
8984
*/
90-
private function addBaseNode(NodeBuilder $nodeBuilder)
85+
private function addOptions(NodeBuilder $nodeBuilder)
9186
{
9287
// @formatter:off
9388
/** @noinspection PhpUndefinedMethodInspection */
94-
$nodeBuilder->arrayNode('base')
89+
$nodeBuilder->scalarNode('use_revisions')
90+
->defaultTrue()
91+
->end()
92+
->scalarNode('base_host')
9593
->isRequired()
96-
->children()
97-
->scalarNode('host')
98-
->isRequired()
99-
->end()
100-
->scalarNode('path')
101-
->isRequired()
102-
->end()
103-
->end();
94+
->end()
95+
->scalarNode('base_path')
96+
->isRequired()
97+
->end();
10498
// @formatter:on
10599

106100
return $this;

AssetsBundle/DependencyInjection/DocplannerAssetsExtension.php

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,34 @@ public function load(array $configs, ContainerBuilder $container)
2121
$configuration = new Configuration();
2222
$config = $this->processConfiguration($configuration, $configs);
2323

24-
foreach (['style', 'script'] as $type)
24+
foreach ($config['types'] as &$typeConfig)
2525
{
26-
foreach ($config[$type]['assets'] as $assetName => &$asset)
26+
foreach ($typeConfig['assets'] as $assetName => &$asset)
2727
{
2828
$src = trim($asset['src']);
29-
$isNetworkResource = false;
3029
if (0 === strpos($src, '//') || false !== filter_var($src, FILTER_VALIDATE_URL))
3130
{
32-
$isNetworkResource = true;
31+
$url = $asset['src'];
32+
$path = null;
33+
}
34+
else
35+
{
36+
$url = $config['base_host'] . $asset['src'];
37+
$path = $config['base_path'] . $asset['src'];
38+
39+
if (false === file_exists($path))
40+
{
41+
throw new \RuntimeException(sprintf('File "%s" not found(asset "%s")!', $path, $assetName));
42+
}
43+
44+
if ($config['use_revisions'])
45+
{
46+
$url .= '?' . crc32(file_get_contents($path));
47+
}
3348
}
3449

35-
$asset['remote'] = $isNetworkResource;
50+
$asset['url'] = $url;
51+
$asset['path'] = $path;
3652
}
3753
}
3854

AssetsBundle/Resources/config/services.yml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ parameters:
22
docplanner_assets_bundle.twig.assets.class: Docplanner\AssetsBundle\Twig\AssetsExtension
33
docplanner_assets_bundle.service.assets_loader.class: Docplanner\AssetsBundle\Service\AssetsLoader
44
docplanner_assets.service.assets_picker.class: Docplanner\AssetsBundle\Service\AssetsPicker
5+
docplanner_assets.service.assets_repository.class: Docplanner\AssetsBundle\Service\AssetsRepository
6+
docplanner_assets.service.assets_provider.class: Docplanner\AssetsBundle\Service\AssetsProvider
57

68
services:
79
docplanner_assets_bundle.twig.assets:
@@ -12,18 +14,16 @@ services:
1214

1315
docplanner_assets_bundle.service.assets_loader:
1416
class: %docplanner_assets_bundle.service.assets_loader.class%
15-
arguments: [ @docplanner_assets.service.assets_picker ]
17+
arguments: [ @docplanner_assets.service.assets_provider ]
1618

1719
docplanner_assets.service.assets_picker:
1820
class: %docplanner_assets.service.assets_picker.class%
1921
arguments: [ @request_stack, %docplanner_assets.config% ]
2022

2123
docplanner_assets.service.assets_repository:
22-
class: Docplanner\AssetsBundle\Service\AssetsRepository
23-
arguments: [ %docplanner_assets.config%, %kernel.cache_dir% ]
24+
class: %docplanner_assets.service.assets_repository.class%
25+
arguments: [ %docplanner_assets.config% ]
2426

25-
docplanner_assets.service.revision_warmer:
26-
class: Docplanner\AssetsBundle\Service\RevisionWarmer
27-
arguments: [ @docplanner_assets.service.assets_repository, %docplanner_assets.config% ]
28-
tags:
29-
- { name: kernel.cache_warmer }
27+
docplanner_assets.service.assets_provider:
28+
class: %docplanner_assets.service.assets_provider.class%
29+
arguments: [ @docplanner_assets.service.assets_repository, @docplanner_assets.service.assets_picker ]

AssetsBundle/Service/AssetsLoader.php

Lines changed: 15 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -2,82 +2,38 @@
22

33
namespace Docplanner\AssetsBundle\Service;
44

5-
use Docplanner\AssetsBundle\IO\Asset;
6-
75
class AssetsLoader
86
{
9-
10-
/** @var AssetsPicker $assetsPicker */
11-
private $asstsPicker;
12-
13-
/**
14-
* @param AssetsPicker $assetsPicker
15-
*/
16-
public function __construct(AssetsPicker $assetsPicker)
17-
{
18-
$this->asstsPicker = $assetsPicker;
19-
}
7+
/** @var AssetsProvider */
8+
private $assetsProvider;
209

2110
/**
22-
* @param bool|false $isInline
23-
*
24-
* @return string
11+
* @param AssetsProvider $assetsProvider
2512
*/
26-
public function renderScript($isInline = false)
13+
public function __construct(AssetsProvider $assetsProvider)
2714
{
28-
$assets = $this->asstsPicker->pickScriptAssets();
29-
$mask = $isInline ? '<script>%s</script>' : '<script src="%s"></script>';
30-
31-
return $this->render($mask, $assets, $isInline);
15+
$this->assetsProvider = $assetsProvider;
3216
}
3317

3418
/**
35-
* @param bool|false $isInline
19+
* @param string $type
20+
* @param bool $inline
3621
*
37-
* @return string
22+
* @return string[]
3823
*/
39-
public function renderStyle($isInline = false)
24+
public function assets($type, $inline = false)
4025
{
41-
$assets = $this->asstsPicker->pickStyleAssets();
42-
$mask = $isInline ? '<style>%s</style>' : '<link rel="stylesheet" type="text/css" href="%s">';
43-
44-
return $this->render($mask, $assets, $isInline);
45-
}
46-
47-
/**
48-
* @param String $mask
49-
* @param Asset[] $assets
50-
* @param boolean $isInline
51-
*
52-
* @return string
53-
*/
54-
private function render($mask, $assets, $isInline)
55-
{
56-
$ret = '';
57-
58-
if (!$isInline)
26+
$result = [];
27+
foreach ($this->assetsProvider->getAssets($type) as $assetName => $asset)
5928
{
60-
foreach ($assets as $asset)
29+
if ($inline !== $asset->isInline())
6130
{
62-
$ret .= sprintf($mask, $asset->getUrl());
63-
}
64-
}
65-
else
66-
{
67-
foreach ($assets as $asset)
68-
{
69-
if ($asset->isInline())
70-
{
71-
$ret .= file_get_contents($asset->getPath() ?: $asset->getUrl());
72-
}
31+
continue;
7332
}
7433

75-
if ($ret)
76-
{
77-
$ret = sprintf($mask, $ret);
78-
}
34+
$result[$assetName] = $inline ? file_get_contents($asset->getPath()) : $asset->getUrl();
7935
}
8036

81-
return $ret;
37+
return $result;
8238
}
8339
}

AssetsBundle/Service/AssetsPicker.php

Lines changed: 9 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -22,43 +22,32 @@ class AssetsPicker
2222
private $config;
2323

2424
/**
25-
* @param RequestStack $requestStack
26-
* @param array $config
25+
* @param RequestStack $requestStack
26+
* @param array $config
2727
*/
2828
public function __construct(RequestStack $requestStack, array $config)
2929
{
3030
$this->requestStack = $requestStack;
3131
$this->config = $config;
3232
}
3333

34-
/**
35-
* @return Asset[]
36-
*/
37-
public function pickStyleAssets()
38-
{
39-
return $this->getAssets('style');
40-
}
41-
42-
/**
43-
* @return Asset[]
44-
*/
45-
public function pickScriptAssets()
46-
{
47-
return $this->getAssets('script');
48-
}
49-
5034
/**
5135
* @param string $type
5236
*
5337
* @return string[] - asset names
5438
*/
55-
private function pickAssets($type)
39+
public function pickAssets($type)
5640
{
41+
if (false === array_key_exists($type, $this->config['types']))
42+
{
43+
throw new \LogicException(sprintf('Type "%s" is not defined!', $type));
44+
}
45+
5746
$route = $this->requestStack->getMasterRequest()->get('_route');
5847

5948
$defaults = [];
6049
$picked = [];
61-
foreach ($this->config[$type]['groups'] as $groupName => $group)
50+
foreach ($this->config['types'][$type]['groups'] as $groupName => $group)
6251
{
6352
if (is_array($group['routes']) && in_array($route, $group['routes']))
6453
{
@@ -82,27 +71,4 @@ private function pickAssets($type)
8271

8372
return $picked;
8473
}
85-
86-
/**
87-
* @param string $type
88-
*
89-
* @return Asset[]
90-
*/
91-
private function getAssets($type)
92-
{
93-
$assets = [];
94-
foreach ($this->pickAssets($type) as $asset)
95-
{
96-
if (false === array_key_exists($asset, $this->config[$type]['assets']))
97-
{
98-
throw new \RuntimeException(sprintf('Asset "%s" not found', $asset));
99-
}
100-
101-
$assetConfig = $this->config[$type]['assets'][$asset];
102-
103-
$assets[] = new Asset($assetConfig['src'], $assetConfig['inline']);
104-
}
105-
106-
return $assets;
107-
}
10874
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
/**
3+
* Author: Łukasz Barulski
4+
* Date: 19.09.15 11:01
5+
*/
6+
7+
namespace Docplanner\AssetsBundle\Service;
8+
9+
use Docplanner\AssetsBundle\IO\Asset;
10+
11+
class AssetsProvider
12+
{
13+
/** @var AssetsRepository */
14+
private $assetsRepository;
15+
16+
/** @var AssetsPicker */
17+
private $assetsPicker;
18+
19+
/**
20+
* @param AssetsRepository $assetsRepository
21+
* @param AssetsPicker $assetsPicker
22+
*/
23+
public function __construct(AssetsRepository $assetsRepository, AssetsPicker $assetsPicker)
24+
{
25+
$this->assetsRepository = $assetsRepository;
26+
$this->assetsPicker = $assetsPicker;
27+
}
28+
29+
/**
30+
* @param string $type
31+
*
32+
* @return Asset[]
33+
*/
34+
public function getAssets($type)
35+
{
36+
$chosenAssets = $this->assetsPicker->pickAssets($type);
37+
if ([] === $chosenAssets)
38+
{
39+
return [];
40+
}
41+
42+
$assets = [];
43+
foreach ($chosenAssets as $asset)
44+
{
45+
$assets[$asset] = $this->assetsRepository->getAsset($type, $asset);
46+
}
47+
48+
return $assets;
49+
}
50+
}

0 commit comments

Comments
 (0)