Injecter le même service avec des alias différents dans Symfony
P粉662802882
2023-08-07 21:55:08
<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>
C'est ma solution à partir d'un projet existant.
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é