Le saviez-vous - Symfony & Doctrine

Qu'est ce Doctrine

Doctrine est un ORM (Object Relational Mapping), composant de Symfony faisant office d'interface entre votre code et la base de donnée.

Cela est utile pour abstraire toute la partie connexion à la base de donnée, l'ORM ce chargeant de la compatibilité avec les différents types de SGBD (Sytème de Gestion de Base de Données).

Si vous aussi vous gérez vos data avec Doctrine, vous devez déjà utiliser abondament les méthodes find, findOneBy, findBy et findAll par défaut de l'ORM.

J'ai appris récemment qu'il était possible de faire une selection avec une condition sur un tableau de valeur.

Cela peut être utile pour récupérer une liste d'items avec leurs ID par exemple.

$items = $this->userRepository->findBy($where = ['id' => 1]); # WHERE id = 1
$items = $this->userRepository->findBy($where = ['id' => [1, 2, 3]]); # WHERE id IN (1, 2, 3)

resolveMagicCall() ou FindByCriteria

De la même façon, Symfony est capable de faire une recherche en rapport avec un critère exprimé directement dans la fonction juste après les mots clefs findBy{criteria} / findOneBy{criteria}

$items = $this->userRepository->findById(1); # WHERE id = 1
$items = $this->userRepository->findByUsername('patrick'); # WHERE username = patrick

Voici le code permettant cela:

namespace Doctrine\ORM;

Class EntityRepository implements ObjectRepository, Selectable {
  private function resolveMagicCall(string $method, string $by, array $arguments)
  {
      if (! $arguments) {
          throw InvalidMagicMethodCall::onMissingParameter($method . $by);
      }

      if (self::$inflector === null) {
          self::$inflector = InflectorFactory::create()->build();
      }

      $fieldName = lcfirst(self::$inflector->classify($by));

      if (! ($this->_class->hasField($fieldName) || $this->_class->hasAssociation($fieldName))) {
          throw InvalidMagicMethodCall::becauseFieldNotFoundIn(
              $this->_entityName,
              $fieldName,
              $method . $by
          );
      }

      return $this->$method([$fieldName => $arguments[0]], ...array_slice($arguments, 1));
  }
}

ParamConverter

Il est possible de jouer avec les annotations et le typage afin de récupérer un utilisateur avec l'id dans l'url par exemple.

/**
 * @Route("/user/{userId}", name="user_show")
 * @ParamConverter("user", class="App\Entity\User", options={"id" = "userId"})
 */
public function show(User $user): JsonResponse {
    return $this->json($user->getUsername());
}

/**
 * @Route("/user/{id}/detail", name="user_detail")
 */
public function show(User $user): JsonResponse {
    return $this->json([
        'firstname' => $user->getFirstname(),
        'lastname' => $user->getLastname(),
        'username' => $user->getUsername()
    ]);
}

MarquandT

Ethical Hacker ~ Web Developper ~ File Hosting Provider ~ Crypto Enthusiast ~ Automation Expert Bitcoin donation: 32Uu4NKGnxSPC7UukYXVyRHwbppbQpKVki

715