Bonjour tous le monde,

J'essaye d'utiliser une class qui permet de gérer tel ou tel action.
Par exemple: j'ai un RdvManager, qui me permet de gérer l'ajout, la modification, la suppression etc pareil pour l'upload de fichier par exemple etc etc.
Mon soucis est que apparemment le BaseManager n'existe plus dans symfony 4 et je ne sais pas comment obtenir par exemple mon entity manager, ou l'utilisateur actuel en faisant

$this->getUser();

Voilà je sais pas si je suis bien claire, n'hésitez pas à poser des questions si besoin.

Merci d'avance pour l'aide ^^

11 réponses


Digivia
Réponse acceptée

avec Symfony 4 la philisophie change un peu. Le container (et sa compilation) ont beaucoup changé, on s'oriente sur un framework plus léger géré en micro-services. Il est désormais préconnisé d'injecter les services dont on a besoin au lieu d'utiliser le container qui contient tout. En terme de perfs c'est beaucoup mieux...

Salut Manuel,

A mon avis, le mieux est de créer ton propre BaseManager, et de créer un manager pour chaque entité que tu crée qui extends ton BaseManager... Tu injectes dans ton BaseManager une Interface EntityManagerInterface.
Ton objectif est de créer une couche d'abstraction supplémentaire entre ton ORM et ton entity? Au cas ou du décides par exemple d'utiliser un ODM ou un autre ORM que Doctrine?

Mon but ça serait surtout de pouvoir alléger mon code au niveau du controller. Imaginons par exemple un script d'ajout d'article, qui permettrais de gérer l'image à uploader etc (séparer également le script d'upload), comme ça dans mon controller je met juste une ligne qui serait qui exemple :

// src/DefaultController.php
$this->get(ArticleManager::class)->create($datas)

C'est vraiment un exmple comme ça au hasard.

D'acc. Tu peux créer un service (une classe) dans laquelle tu injectes tout ce dont tu as besoin (entityManager par exemple), et qui prend en charge l'ajout/modif de tes données... Mais si tu utilises le composant form de symfony, il hydrate déja ton entité...

Je ne souhaite pas faire ça uniquement avec mon entité c'est pour ça que je demande, par exemple pour l'upload de fichier, la partie qui créer un nom unique etc etc ce n'est pas avec un repository ou un formtype que je vais le faire. Je vais voir pour le service, mais j'avais vu avec Symfony 3 le BaseManager et qui me permettais d'accéder a beaucoup de trucs comme si c'étais un container, c'est ca qui m'intéressais.

Rien ne t'empêche, par domaine (entités, gestion de fichiers, etc.) de créer des "BaseManager" toi-même, d'y ajouter une interface pour la perenité du code et de les étendre suivant tes cas particuliers...
Par exemple un BaseEntityManager, qui sera étendu par exemple par un NewsManager.
L'utilisation des Traits peut également être intéressant (pour le champ ID dans une entité par exemple)

Vu que je suis pas non plus un expert en symfony, je vais récapituler voir si j'ai bien compris ^^

Donc pour créer mon manager, je crée donc un manager global selon le besoin, que je déclare en tant que service avec des injections si j'ai besoin, et ensuite d'étendre ce / ces managers sur une situation spécifique selon la base qui corresponds c'est ça ? ^^

Exemple avec des logs :

Je crée un BaseManager que je déclare en service auquel j'envois un injection EntityManager.

Ensuite je créer un LogManager qui extend de BaseManager.

Je crée un script add par exemple qui va utiliser le entityManager qui est injecté via le BaseManager.

c'est ça ?

Par exemple :
Tu crée un service qui va gérer ton accès à l'entité News.
Tu délares ton service (services.yaml):

App\Manager\Entity\NewsManager:
    arguments:
    - '@doctrine.orm.entity_manager'
    calls:
            - method: setRepository
              arguments:
                  - '%App\Repository\NewsRepository%'

Et ta classe :

<?php
namespace App\Manager\Entity;

use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;

class NewsManager
{
    /** @var EntityManager */
    private $entityManager;

    /** @var EntityRepository */
    protected $repository;

    public function __construct(EntityManager $entityManager)
    {
        $this->setEntityManager($entityManager);
    }

    public function findBy(array $conditions, array $order)
    {
        $this->getRepository()->findBy($conditions, $order);
    }

    public function myAwesomeFunction($params)
    {
        //...
    }

    /**
     *  -------------------
     *      ACCESSORS
     *  -------------------
     */

    public function getEntityManager(): EntityManager
    {
        return $this->entityManager;
    }

    public function setEntityManager(EntityManager $entityManager): self
    {
        $this->entityManager = $entityManager;
        return $this;
    }

    public function getRepository(): EntityRepository
    {
        return $this->repository;
    }

    public function setRepository(EntityRepository $repository): self
    {
        $this->repository = $repository;
        return $this;
    }
}

D'accord ! je pense que c'est bien ce que j'ai donc compris ^^ merci beaucoup ^^

Après c'est pas un super exemple, mais ça illustre un peu le truc ;)

Oui j'ai compris je pense, c'est ce que je disais du coup dans mon pavé (pas très claire ;) )