Skip to content

Commit 3a11996

Browse files
authored
Merge pull request #1529 from garak/remove-container
do not inject container in PropertyMappingResolver
2 parents b5a5862 + 67c4028 commit 3a11996

11 files changed

Lines changed: 100 additions & 81 deletions

File tree

UPGRADE.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
# Upgrading from v2.5 to v2.6
1+
# Upgrading from v2.7 to v2.8
2+
3+
* Namers are not public anymore. If you uses a custom namer, you can now make it private.
4+
5+
# Upgrading from v2.6 to v2.7
26

37
* Now the original extension '.xlsb' is retained even if the mime type is guessed as 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'.
48

config/factory.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
66
<services>
77
<service id="vich_uploader.property_mapping_resolver" class="Vich\UploaderBundle\Mapping\PropertyMappingResolver" public="false">
8-
<argument type="service" id="service_container" />
8+
<argument type="tagged_iterator" tag="vich_uploader.namer"/>
9+
<argument type="tagged_iterator" tag="vich_uploader.dir_namer"/>
910
<argument>%vich_uploader.mappings%</argument>
1011
<argument>%vich_uploader.default_filename_attribute_suffix%</argument>
1112
</service>

config/namer.xml

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,38 +5,44 @@
55
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
66

77
<services>
8-
<service id="Vich\UploaderBundle\Naming\UniqidNamer" public="true"/>
9-
<service id="Vich\UploaderBundle\Naming\PropertyNamer" public="true">
8+
<instanceof id="Vich\UploaderBundle\Naming\NamerInterface" autowire="true">
9+
<tag name="vich_uploader.namer"/>
10+
</instanceof>
11+
<instanceof id="Vich\UploaderBundle\Naming\DirectoryNamerInterface" autowire="true">
12+
<tag name="vich_uploader.dir_namer"/>
13+
</instanceof>
14+
<service id="Vich\UploaderBundle\Naming\UniqidNamer" public="false"/>
15+
<service id="Vich\UploaderBundle\Naming\PropertyNamer" public="false">
1016
<argument type="service" id="Vich\UploaderBundle\Util\Transliterator"/>
1117
</service>
12-
<service id="Vich\UploaderBundle\Naming\OrignameNamer" public="true">
18+
<service id="Vich\UploaderBundle\Naming\OrignameNamer" public="false">
1319
<argument type="service" id="Vich\UploaderBundle\Util\Transliterator"/>
1420
</service>
15-
<service id="Vich\UploaderBundle\Naming\HashNamer" public="true"/>
16-
<service id="Vich\UploaderBundle\Naming\Base64Namer" public="true"/>
17-
<service id="Vich\UploaderBundle\Naming\SubdirDirectoryNamer" public="true"/>
18-
<service id="Vich\UploaderBundle\Naming\PropertyDirectoryNamer" public="true">
21+
<service id="Vich\UploaderBundle\Naming\HashNamer" public="false"/>
22+
<service id="Vich\UploaderBundle\Naming\Base64Namer" public="false"/>
23+
<service id="Vich\UploaderBundle\Naming\SubdirDirectoryNamer" public="false"/>
24+
<service id="Vich\UploaderBundle\Naming\PropertyDirectoryNamer" public="false">
1925
<argument type="service" id="property_accessor" on-invalid="null"/>
2026
<argument type="service" id="Vich\UploaderBundle\Util\Transliterator"/>
2127
</service>
22-
<service id="Vich\UploaderBundle\Naming\CurrentDateTimeDirectoryNamer" public="true">
28+
<service id="Vich\UploaderBundle\Naming\CurrentDateTimeDirectoryNamer" public="false">
2329
<argument type="service" id="property_accessor" on-invalid="null"/>
2430
</service>
25-
<service id="Vich\UploaderBundle\Naming\ConfigurableDirectoryNamer" public="true"/>
26-
<service id="Vich\UploaderBundle\Naming\SmartUniqueNamer" public="true">
31+
<service id="Vich\UploaderBundle\Naming\ConfigurableDirectoryNamer" public="false"/>
32+
<service id="Vich\UploaderBundle\Naming\SmartUniqueNamer" public="false">
2733
<argument type="service" id="Vich\UploaderBundle\Util\Transliterator"/>
2834
</service>
2935

30-
<service id="vich_uploader.namer_uniqid" alias="Vich\UploaderBundle\Naming\UniqidNamer" public="true"/>
31-
<service id="vich_uploader.namer_property" alias="Vich\UploaderBundle\Naming\PropertyNamer" public="true"/>
32-
<service id="vich_uploader.namer_origname" alias="Vich\UploaderBundle\Naming\OrignameNamer" public="true"/>
33-
<service id="vich_uploader.namer_hash" alias="Vich\UploaderBundle\Naming\HashNamer" public="true"/>
34-
<service id="vich_uploader.namer_base64" alias="Vich\UploaderBundle\Naming\Base64Namer" public="true"/>
35-
<service id="vich_uploader.directory_namer_subdir" alias="Vich\UploaderBundle\Naming\SubdirDirectoryNamer" public="true"/>
36-
<service id="vich_uploader.namer_directory_property" alias="Vich\UploaderBundle\Naming\PropertyDirectoryNamer" public="true"/>
37-
<service id="vich_uploader.namer_directory_current_date_time" alias="Vich\UploaderBundle\Naming\CurrentDateTimeDirectoryNamer" public="true"/>
38-
<service id="vich_uploader.namer_directory_configurable" alias="Vich\UploaderBundle\Naming\ConfigurableDirectoryNamer" public="true"/>
39-
<service id="vich_uploader.namer_smart_unique" alias="Vich\UploaderBundle\Naming\SmartUniqueNamer" public="true"/>
36+
<service id="vich_uploader.namer_uniqid" alias="Vich\UploaderBundle\Naming\UniqidNamer" public="false"/>
37+
<service id="vich_uploader.namer_property" alias="Vich\UploaderBundle\Naming\PropertyNamer" public="false"/>
38+
<service id="vich_uploader.namer_origname" alias="Vich\UploaderBundle\Naming\OrignameNamer" public="false"/>
39+
<service id="vich_uploader.namer_hash" alias="Vich\UploaderBundle\Naming\HashNamer" public="false"/>
40+
<service id="vich_uploader.namer_base64" alias="Vich\UploaderBundle\Naming\Base64Namer" public="false"/>
41+
<service id="vich_uploader.directory_namer_subdir" alias="Vich\UploaderBundle\Naming\SubdirDirectoryNamer" public="false"/>
42+
<service id="vich_uploader.namer_directory_property" alias="Vich\UploaderBundle\Naming\PropertyDirectoryNamer" public="false"/>
43+
<service id="vich_uploader.namer_directory_current_date_time" alias="Vich\UploaderBundle\Naming\CurrentDateTimeDirectoryNamer" public="false"/>
44+
<service id="vich_uploader.namer_directory_configurable" alias="Vich\UploaderBundle\Naming\ConfigurableDirectoryNamer" public="false"/>
45+
<service id="vich_uploader.namer_smart_unique" alias="Vich\UploaderBundle\Naming\SmartUniqueNamer" public="false"/>
4046
<service id="Vich\UploaderBundle\Util\Transliterator" public="false">
4147
<argument type="service" id="slugger"/>
4248
</service>

docs/directory_namer/howto/create_a_custom_directory_namer.md

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,6 @@ vich_uploader:
2020
directory_namer: my.directory_namer.product
2121
```
2222
23-
**Note**:
24-
25-
> The directory namer service must be public.
26-
> If you're using default configuration, make sure to explicit public visibility
27-
> for your directory namer service
28-
2923
## That was it!
3024
3125
Check out the docs for information on how to use the bundle! [Return to the

docs/file_namer/howto/create_a_custom_file_namer.md

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,6 @@ vich_uploader:
2727
2828
Where `App\Naming\MyNamer` is the configured service class.
2929

30-
> [!NOTE]
31-
> The namer service must be public.
32-
> If you're using default configuration, make sure to explicit public visibility
33-
> for your namer service
34-
3530
## That was it!
3631

3732
Check out the docs for information on how to use the bundle! [Return to the

docs/namers.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ To use it, you just have to specify the service for the `namer` configuration op
7070
# config/services.yaml
7171
services:
7272
Vich\UploaderBundle\Naming\SlugNamer:
73-
public: true
7473
arguments:
7574
$service: '@App\Repository\MyFileRepository'
7675
$method: findOneByPath
@@ -96,8 +95,7 @@ vich_uploader:
9695
Like file namers, directory namers allow you to customize the directory in which
9796
uploaded files will be stored.
9897

99-
**Note**:
100-
98+
> [!NOTE]
10199
> Directory namers are called when a file is uploaded but also later, when you
102100
> want to retrieve the path or URL of an already uploaded file. That's why
103101
> **directory namers MUST be stateless** and rely only on the data provided by

src/DependencyInjection/VichUploaderExtension.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
use Symfony\Component\DependencyInjection\Reference;
1414
use Vich\UploaderBundle\Exception\MissingPackageException;
1515
use Vich\UploaderBundle\Metadata\CacheWarmer;
16+
use Vich\UploaderBundle\Naming\DirectoryNamerInterface;
17+
use Vich\UploaderBundle\Naming\NamerInterface;
1618
use Vich\UploaderBundle\Storage\StorageInterface;
1719

1820
/**
@@ -30,6 +32,9 @@ final class VichUploaderExtension extends Extension
3032

3133
public function load(array $configs, ContainerBuilder $container): void
3234
{
35+
$container->registerForAutoconfiguration(DirectoryNamerInterface::class)->addTag('vich_uploader.dir_namer');
36+
$container->registerForAutoconfiguration(NamerInterface::class)->addTag('vich_uploader.namer');
37+
3338
$configuration = new Configuration();
3439
$config = $this->processConfiguration($configuration, $configs);
3540

src/Mapping/PropertyMappingResolver.php

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,26 @@
44

55
namespace Vich\UploaderBundle\Mapping;
66

7-
use Symfony\Component\DependencyInjection\ContainerInterface;
87
use Vich\UploaderBundle\Exception\MappingNotFoundException;
98
use Vich\UploaderBundle\Naming\ConfigurableInterface;
9+
use Vich\UploaderBundle\Naming\DirectoryNamerInterface;
10+
use Vich\UploaderBundle\Naming\NamerInterface;
1011
use Vich\UploaderBundle\Util\ClassUtils;
1112

1213
/**
13-
* PropertyMappingResolver.
14-
*
1514
* @author Dustin Dobervich <ddobervich@gmail.com>
1615
*
1716
* @internal
1817
*/
1918
final class PropertyMappingResolver implements PropertyMappingResolverInterface
2019
{
20+
/**
21+
* @param iterable<NamerInterface> $namers
22+
* @param iterable<DirectoryNamerInterface> $dirNamers
23+
*/
2124
public function __construct(
22-
private readonly ContainerInterface $container,
25+
private readonly iterable $namers,
26+
private readonly iterable $dirNamers,
2327
private readonly array $mappings,
2428
private readonly ?string $defaultFilenameAttributeSuffix = '_name'
2529
) {
@@ -42,7 +46,7 @@ public function resolve(object|array $obj, string $fieldName, array $mappingData
4246

4347
if (!empty($config['namer']) && null !== $config['namer']['service']) {
4448
$namerConfig = $config['namer'];
45-
$namer = $this->container->get($namerConfig['service']);
49+
$namer = $this->getNamer($namerConfig['service']);
4650

4751
if (!empty($namerConfig['options'])) {
4852
if (!$namer instanceof ConfigurableInterface) {
@@ -56,7 +60,7 @@ public function resolve(object|array $obj, string $fieldName, array $mappingData
5660

5761
if (!empty($config['directory_namer']) && null !== $config['directory_namer']['service']) {
5862
$namerConfig = $config['directory_namer'];
59-
$namer = $this->container->get($namerConfig['service']);
63+
$namer = $this->getDirectoryNamer($namerConfig['service']);
6064

6165
if (!empty($namerConfig['options'])) {
6266
if (!$namer instanceof ConfigurableInterface) {
@@ -70,4 +74,32 @@ public function resolve(object|array $obj, string $fieldName, array $mappingData
7074

7175
return $mapping;
7276
}
77+
78+
private function getNamer(string $service): NamerInterface
79+
{
80+
if (\str_contains($service, '.')) {
81+
$service = \substr($service, 0, \strrpos($service, '.'));
82+
}
83+
foreach ($this->namers as $namer) {
84+
if ($namer::class === $service) {
85+
return $namer;
86+
}
87+
}
88+
89+
throw new \UnexpectedValueException(\sprintf('Namer service "%s" not found.', $service));
90+
}
91+
92+
private function getDirectoryNamer(string $service): DirectoryNamerInterface
93+
{
94+
if (\str_contains($service, '.')) {
95+
$service = \substr($service, 0, \strrpos($service, '.'));
96+
}
97+
foreach ($this->dirNamers as $namer) {
98+
if ($namer::class === $service) {
99+
return $namer;
100+
}
101+
}
102+
103+
throw new \UnexpectedValueException(\sprintf('Directory namer service "%s" not found.', $service));
104+
}
73105
}

tests/Fixtures/App/app/config/config.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ services:
4040
resource: '../../../TestBundle/src/Controller'
4141
Vich\TestBundle\Naming\:
4242
resource: '../../../TestBundle/src/Naming'
43-
public: true
4443

4544
vich_uploader:
4645
db_driver: orm
Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
<?xml version="1.0" encoding="UTF-8" ?>
2-
32
<!-- Copy of the file in config/doctrine, if update is done there this should be updated too -->
43
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
54
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
65
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
76
https://raw.github.com/doctrine/doctrine2/master/doctrine-mapping.xsd">
87
<entity name="Vich\TestBundle\Entity\Image">
98
<id name="id" type="integer">
10-
<generator strategy="AUTO"/>
9+
<generator/>
1110
</id>
12-
<field name="title" column="title"/>
13-
<field name="updatedAt" column="updated_at" type="datetime"/>
14-
<field name="imageName" column="image_name" nullable="true"/>
11+
<field name="title"/>
12+
<field name="updatedAt" type="datetime"/>
13+
<field name="imageName" nullable="true"/>
1514
</entity>
16-
</doctrine-mapping>
15+
</doctrine-mapping>

0 commit comments

Comments
 (0)