Skip to content

Commit 21c5fd8

Browse files
committed
Exclude searchers from the service container
1 parent 832c28c commit 21c5fd8

4 files changed

Lines changed: 32 additions & 0 deletions

File tree

doc/crud.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,10 @@ class CarSearcher extends AbstractSearcher
346346

347347
> **_REMARQUE:_** Il est aussi possible de faire des recherches plus complexes sans utiliser les filtres pré-définis. [En savoir plus](cookbook/advanced-searcher.md)
348348

349+
> **_REMARQUE:_** La classe Searcher est un objet de données (elle est stockée en session), et non un service : elle est
350+
> automatiquement exclue du conteneur de services et doit être instanciée avec `new`. Pour utiliser un service dans la
351+
> classe Searcher, passez-le par [les options du formulaire de recherche](cookbook/advanced-searcher.md#définir-les-options-du-formulaire-de-recherche).
352+
349353
Une fois la classe Searcher créée, nous devons modifier notre contrôleur :
350354

351355
```diff

doc/upgrade/3.0.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,10 @@
161161
* [Création d'un formulaire de recherche](../crud.md#ajout-formulaire-de-recherche-facultatif)
162162
* [Options du formulaire de recherche](../references/searcher.md)
163163
* [Personnalisation avancée de la classe Searcher](../cookbook/advanced-searcher.md)
164+
* Les classes implémentant `SearcherInterface` sont maintenant automatiquement exclues du conteneur de services
165+
(lorsque l'autoconfiguration est activée). Une classe Searcher ne peut donc plus être injectée ni autowirée : elle doit
166+
être instanciée avec `new`. Pour utiliser un service dans une classe Searcher, passez-le par
167+
[les options du formulaire de recherche](../cookbook/advanced-searcher.md#définir-les-options-du-formulaire-de-recherche).
164168
* La protection CSRF est maintenant activée sur le formulaire de recherche (`FormSearchType`). Le jeton CSRF est
165169
automatiquement rendu par la fonction Twig `crud_search_form_start`. Si vous surchargez le bloc Twig
166170
`search_form_start` ou si vous n'utilisez pas cette fonction Twig, vous devez rendre vous-même le champ `_token`

src/DependencyInjection/EcommitCrudExtension.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
namespace Ecommit\CrudBundle\DependencyInjection;
1515

1616
use Ecommit\CrudBundle\Form\Filter\FilterInterface;
17+
use Ecommit\CrudBundle\Form\Searcher\SearcherInterface;
1718
use Symfony\Component\Config\FileLocator;
1819
use Symfony\Component\DependencyInjection\ContainerBuilder;
1920
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
@@ -43,5 +44,10 @@ public function load(array $configs, ContainerBuilder $container): void
4344
$container->setParameter('ecommit_crud.twig_functions_configuration', $configs['twig_functions_configuration']);
4445

4546
$container->registerForAutoconfiguration(FilterInterface::class)->addTag('ecommit_crud.filter');
47+
48+
// Searchers are stored in the session: they are data objects, not services
49+
$container->registerForAutoconfiguration(SearcherInterface::class)->addTag('container.excluded', [
50+
'source' => 'because searchers are stored in the session and must not be services (to use a service in a searcher, pass it in the search form options)',
51+
]);
4652
}
4753
}

tests/DependencyInjection/EcommitCrudExtensionTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,12 @@
1313

1414
namespace Ecommit\CrudBundle\Tests\DependencyInjection;
1515

16+
use Ecommit\CrudBundle\DependencyInjection\EcommitCrudExtension;
1617
use Ecommit\CrudBundle\Tests\Functional\App\Form\Filter\MyFilter;
18+
use Ecommit\CrudBundle\Tests\Functional\App\Form\Searcher\UserSearcher;
1719
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
20+
use Symfony\Component\DependencyInjection\Compiler\ResolveInstanceofConditionalsPass;
21+
use Symfony\Component\DependencyInjection\ContainerBuilder;
1822

1923
class EcommitCrudExtensionTest extends KernelTestCase
2024
{
@@ -29,4 +33,18 @@ public function testAutoconfigureTag(): void
2933

3034
$this->assertTrue($crudFilters->has(MyFilter::class));
3135
}
36+
37+
public function testSearcherIsExcludedFromContainer(): void
38+
{
39+
$container = new ContainerBuilder();
40+
$extension = new EcommitCrudExtension();
41+
$extension->load([[
42+
'theme' => '@EcommitCrud/Theme/base.html.twig',
43+
'icon_theme' => '@EcommitCrud/IconTheme/base.html.twig',
44+
]], $container);
45+
$container->register(UserSearcher::class, UserSearcher::class)->setAutoconfigured(true);
46+
(new ResolveInstanceofConditionalsPass())->process($container);
47+
48+
$this->assertTrue($container->getDefinition(UserSearcher::class)->hasTag('container.excluded'));
49+
}
3250
}

0 commit comments

Comments
 (0)