Injecter le même service avec des alias différents dans Symfony
P粉662802882
P粉662802882 2023-08-07 21:55:08
0
1
426
<p>Je ne sais pas si ce que vous demandez est exact, alors laissez-moi vous expliquer<br /><br />J'utilise foselasticabundance avec cette configuration :</p><p>< ;br /> <pre class="brush:php;toolbar:false;"># Lire la documentation : https://github.com/FriendsOfSymfony/FOSElasticaBundle/blob/master/doc/setup.md fos_elastica : clients : par défaut : { url : '%env(ELASTICSEARCH_URL)%' } index : des articles: nom_index : 'articles' persistance: # le pilote peut être orm, mongodb ou phpcr pilote:orm modèle : AppEntitySiteFArticleFArticleProp fournisseur : ~ chercheur : ~</pre> <p>Pour<span style="white-space:normal;">de cette façon</span>interroger l'index de mon article :</p> <pre class="brush:php;toolbar:false;"><?php espace de noms AppService ; utilisez FOSElasticaBundleFinderTransformedFinder ; classe FArticleService { fonction publique __construct( privé en lecture seule TransformedFinder $finder, ) { } requête de fonction publique (tableau $query, int $page, int $size) { $results = $this->finder->createRawPaginatorAdapter($query)->getResults(($page * $size) - $size, $size); } }≪/pré> <p>但是有个错:</p> <pre class="brush:php;toolbar:false;">Dans DefinitionErrorExceptionPass.php ligne 51 : Impossible de câbler automatiquement le service « AppServiceFArticleService » : l'argument « $finder » de la méthode « __construct() » fait référence à la classe « FOSElasticaBundleFinderTransformedFinder », mais aucun service de ce type n'existe. Vous devriez peut-être attribuer un alias à cette classe au service "fos_elastica.finder.articles" existant.</pre> <p>我改了一下</p> <pre class="brush:php;toolbar:false;"># api/config/services.yaml prestations de service: #... FOSElasticaBundleFinderTransformedFinder : Alias : fos_elastica.finder.articles public : true</pre> <p>这样还挺好<br /><br /> ;</p> <pre class="lang-yaml Prettyprint-override"><code># Lire la documentation : https://github.com/FriendsOfSymfony/FOSElasticaBundle/blob/master/doc/setup.md fos_elastica : clients : par défaut : { url : '%env(ELASTICSEARCH_URL)%' } index : des articles: nom_index : 'articles' persistance: # le pilote peut être orm, mongodb ou phpcr pilote : orm modèle : AppEntitySiteFArticleFArticleProp fournisseur : ~ chercheur : ~ fdocentetes : nom_index : 'fdocentetes' persistance: # le pilote peut être orm, mongodb ou phpcr pilote : orm modèle : AppEntitySageFDocentete fournisseur : ~ chercheur : ~ </code></pre> <p>文章,所以如果我创建另一个服务fdocteteservice:</p> <pre class="lang-php Prettyprint-override"><code><?php espace de noms AppService ; utilisez FOSElasticaBundleFinderTransformedFinder ; classe FDocenteteService { fonction publique __construct( privé en lecture seule TransformedFinder $finder, ) { } requête de fonction publique (tableau $query, int $page, int $size) { // ceci interrogera les articles de l'index pendant que je souhaite interroger l'index fdocentetes $results = $this->finder->createRawPaginatorAdapter($query)->getResults(($page * $size) - $size, $size); } } </code></pre> <p>那现在咋办</p> <pre class="brush:php;toolbar:false;">$ php bin/console debug:container | grep fos_elastica.finder FOSElasticaBundleFinderTransformedFinder alias pour "fos_elastica.finder.articles" fos_elastica.finder FOSElasticaBundleFinderTransformedFinder fos_elastica.finder.articles FOSElasticaBundleFinderTransformedFinder fos_elastica.finder.fdocentetes FOSElasticaBundleFinderTransformedFinder</pre> <pre class="brush:php;toolbar:false;">$ php bin/console debug:autowiring | grep fos_elastica.finder FOSElasticaBundleFinderTransformedFinder (fos_elastica.finder.articles)</pre> <p><br /></p>
P粉662802882
P粉662802882

répondre à tous(1)
P粉777458787

C'est ma solution à partir d'un projet existant.

app.service.configuration_service_foo:
    public: true
    class: App\Service\ConfigurationService
    arguments:
      - '@app.config.foo_config'

app.service.configuration_service_bar:
    public: true
    class: App\Service\ConfigurationService
    arguments:
      - '@app.config.bar_config'
private ConfigurationService $configServiceFoo;
private ConfigurationService $configServiceBar;

public function __construct(
    ContainerInterface $container,
) {
    $this->configServiceFoo = clone $container->get('app.service.configuration_service_foo');
    $this->configServiceBar = clone $container->get('app.service.configuration_service_bar');
}

Il devrait y avoir d'autres méthodes.

Il n'est pas possible d'injecter deux fois le même objet via un appel automatique. Par conséquent, ContainerInterface est injecté.

Ensuite, vous devez cloner ces services. Je ne m'en souviens pas clairement, ça fait tellement longtemps que j'ai oublié


Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal