Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony] FosElasticaBundle avec Api Plateform

    11 octobre 2018 à 22:11:10

    Bonjour,

    Je tente bien que mal de faire fonctionner FosElasticaBundle avec Api Plateform.

    Il n'arrive pas a accéder au service FosElasticaBundle avec l'autowire à True d'où mon erreur est : 

      "detail": "Notice: Undefined property: App\\Repository\\EventRepository::$container",

    Quelqu'un a t-il une idée ? Merci d'avance

    <?php
    
    
    namespace App\Repository;
    
    use FOS\ElasticaBundle\Repository;
    
    /**
     * Classe EventRepository
     *
    */
    
    class EventRepository extends Repository
    {
        /**
         * @return array
         */
        function getQueryForMultipleItems()
        {
            return ['C\'est une collection'];
        }
    
        /**
         * @param string $idEvent
         *
         * @return array
         */
        function getQueryForSingleItem(string $idEvent)
        {
            $finder = $this->container->get('fos_elastica.finder.app.event');
    
            $results = $finder->find($idEvent);
    
            return $results;
        }
    }



    Fos_elastica.yml

    # Read the documentation: https://github.com/FriendsOfSymfony/FOSElasticaBundle/blob/master/Resources/doc/setup.md
    fos_elastica:
        clients:
            default: { host: 127.0.0.1, port: 9200 }
        indexes:
            trackevent:
                finder: ~
                types:
                    event:
                        serializer:
                            groups: [elastica]
                        persistence:
                        # the driver can be orm, mongodb or phpcr
                            driver: orm
                            model: App\Entity\Event
                            provider: ~
                            finder: ~
                            repository: App\Repository\EventRepository
    


    <?php
    
    namespace App\DataProvider;
    
    use ApiPlatform\Core\DataProvider\ItemDataProviderInterface;
    use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
    use App\Entity\Event;
    use App\Repository\EventRepository;
    use FOS\ElasticaBundle\Manager\RepositoryManagerInterface;
    
    /**
     * Classe ItemDataProvider
     */
    class EventItemDataProvider implements ItemDataProviderInterface, RestrictedDataProviderInterface
    {
        private $repositoryManager;
    
        /**
         * ItemDataProvider constructor.
         *
         * @param RepositoryManagerInterface $repositoryManager
         */
        public function __construct(RepositoryManagerInterface $repositoryManager)
        {
            $this->repositoryManager = $repositoryManager;
        }
    
        /**
         * @param string      $resourceClass
         * @param string|null $operationName
         * @param array       $context
         *
         * @return bool
         */
        public function supports(string $resourceClass, string $operationName = null, array $context = []): bool
        {
            return Event::class === $resourceClass;
        }
    
        /**
         * @param string      $resourceClass
         * @param int|string  $idObject
         * @param string|null $operationName
         * @param array       $context
         *
         * @return mixed|null|object
         */
        public function getItem(string $resourceClass, $idObject, string $operationName = null, array $context = [])
        {
            /** @var EventRepository $repository */
            $repository = $this->repositoryManager->getRepository($resourceClass);
            $results = $repository->getQueryForSingleItem($idObject);
    
            return $results;
        }
    }



    -
    Edité par aymericl22 11 octobre 2018 à 22:23:37

    • Partager sur Facebook
    • Partager sur Twitter
      13 octobre 2018 à 17:08:09

      Hello,

      $this->containe n'existe pas dans le repository, tu dois l'y injecter

      • Partager sur Facebook
      • Partager sur Twitter
        16 octobre 2018 à 17:44:21

        Mais pourtant si j'ai mon autowiring à true, ça devrait marcher non ?
        • Partager sur Facebook
        • Partager sur Twitter
          16 octobre 2018 à 19:20:13

          L'autowired permet d'injecter des services en utilisant leur class comme id de service.

          Si tu passes par le container alors tu n'utilises pas l'injection par autowired

          Après, ton problème ne vient pas de là. Tu appelles l'attribut container sur $this dans ton repository or ce dernier ne possède pas l'attribut container. (Dans un controller, c'est possible car ton controller hérite de la class controller qui possède container)

          Il y a deux solutions:

          • injecter le container via le constructeur du repository puis l'utiliser pour obtenir ton service
          • injecter le service recherché via le constructeur du repository
          • Partager sur Facebook
          • Partager sur Twitter
            16 octobre 2018 à 21:30:01

            Merci beaucoup, j'ai injecté mon service dans le repository.

            • Partager sur Facebook
            • Partager sur Twitter

            [Symfony] FosElasticaBundle avec Api Plateform

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown