2017-09-24 4 views
0

Salut je veux injecter un service Classe sans appeler son constructeur, soit je n'ai pas encore l'argument à passer à cette classe constructeur injectée.Symfony injecter le service Classe sans appeler son constructeur

Exemple:

services: 
your.service.name: 
    class: AppBundle\Services\YourClassName 
    arguments: ['@doctrine.services.paginator'] 

doctrine.services.paginator: 
    class: Doctrine\ORM\Tools\Pagination\Paginator 
    public: false 

erreur de retour

Type error: Too few arguments to function Doctrine\ORM\Tools\Pagination\Paginator::__construct(), 0 passed in ... and at least 1 expected

+1

Pourquoi voulez-vous injecter 'Paginator' sans appeler le constructeur? J'ai l'impression que vous essayez de faire quelque chose de la mauvaise façon. – qooplmao

+0

puis-je faire "nouveau Paginator()" dans le service? – spinoza

Répondre

1

Il est un peu difficile à instancier une classe sans utiliser le constructeur,
documentation PHP dit:

PHP 5 allows developers to declare constructor methods for classes. Classes which have a constructor method call this method on each newly-created object, so it is suitable for any initialization that the object may need before it is used.

PHP constructor documentation

Si vous voulez utiliser le paginator sans dépendances d'injection, vous pouvez suivre la documentation de la doctrine:

Doctrine paginator documentation

Fondamentalement, vous insérez une utilisation dans la déclaration de votre référentiel.

use Doctrine\ORM\Tools\Pagination\Paginator; 

Et puis utilisez un objet de la classe Paginator avec votre requête:

$qb = $this->CreateQueryBuilder('u'); 
// ... build your query here... 
$qb->getQuery(); 
$paginator = new Paginator($qb, false); 
$count = count($paginator); 
return array($paginator, $count); // Process the results in your controller 

Hope this helps

1

Vous pouvez utiliser l'injection setter, qui est facultatif, et pas vraiment recommandé, mais Je ne vais pas approfondir à ce sujet.

Exemple:

<?php 

class YourClassName 
{ 
    private $paginator; 

    public function setPaginator(PaginatorInterface $paginator) 
    { 
     $this->paginator = $paginator; 
    } 

    public function getPaginator() 
    { 
     if ($this->paginator instanceof PaginatorInterface) { 
      return $this->paginator; 
     } 

     throw new \RuntimeException('Paginator is not defined'); 
    } 
} 

Ensuite, vous pouvez injecter votre service sans spécifier paginator comme argument:

services: 
    your.service.name: 
     class: AppBundle\Services\YourClassName 

et injecter la place dans un moteur d'exécution:

$this->get('your.service.name')->setPaginator($paginator); 

En cas , si vous avez besoin d'injecter paginator également avec conteneur, vous pouvez utiliser calls argum avec service, more in docs.

Si vous devez obtenir une nouvelle instance chaque fois que vous recevez un service du conteneur, vous pouvez utiliser l'argument shared, more in docs.