Comment évoluer vers un milliard de documents dans Symfony - Partie II

DEV - 27/02
Cet article a été rédigé par Andreas Braun. Création d'une application Dans la première partie de...

Cet article a été rédigé par Andreas Braun.

Création d'une application

Dans la première partie de cette série, nous avons conçu un schéma pour stocker les prix du carburant dans MongoDB et importé une grande quantité de données dans la base de données. Nous avons également examiné comment agréger efficacement ces données à l'aide du cadre d'agrégation de MongoDB. Une fois la base de données préparée, il est maintenant temps de créer une application Symfony qui nous permet d'interagir avec ces données. Dans cette partie du didacticiel, nous utiliserons l'ODM Doctrine MongoDB pour mapper nos documents aux classes PHP et Symfony UX pour créer une interface moderne.

Pour récapituler, voici ce que nous souhaitons que notre application fasse :

  • Afficher un tableau de bord avec des informations générales
  • Afficher une liste de stations
  • Autoriser la recherche d'une station par nom, marque ou emplacement
  • Afficher les détails d'une station, notamment :
    • Une carte montrant l'emplacement de la station
    • Les derniers prix pour chaque type de carburant
    • Un graphique montrant l'historique des prix du dernier jour

Configuration de l'application

Tout d’abord, nous avons configuré notre application Symfony à l’aide de la CLI Symfony. Si vous ne l'avez pas encore installé, vous pouvez trouver des instructions sur le site Web de Symfony. Une fois la CLI installée, créez un nouveau projet Symfony :

symfony nouveau --webapp carburant-prix-app
Entrer en mode plein écran Quitter le mode plein écran

Cela crée une nouvelle application Web avec la dernière version de Symfony. Puisque nous n'avons pas besoin de l'ORM Doctrine, nous pouvons supprimer un certain nombre de packages de composer.json :

composer supprimer doctrine/dbal doctrine/doctrine-bundle doctrine/doctrine-migrations-bundle doctrine/orm symfony/doctrine-messenger
Entrer en mode plein écran Quitter le mode plein écran

Maintenant, assurez-vous que l'extension MongoDB est installée et activée. Si vous ne l'avez pas encore installé, installez-le en utilisant pie :

tarte installer mongodb/mongodb-extension : ^ 2.1
Entrer en mode plein écran Quitter le mode plein écran

Nous sommes maintenant prêts à installer le bundle Doctrine MongoDB ODM. Ce bundle permet une configuration facile de l'ODM Doctrine MongoDB et fournit un ensemble d'outils pour travailler avec MongoDB dans les applications Symfony. Pour installer le bundle, exécutez la commande suivante dans le répertoire de votre projet :

le compositeur nécessite une doctrine/mongodb-odm-bundle
Entrer en mode plein écran Quitter le mode plein écran

À l'aide de Symfony Flex, cette commande configure tout ce dont vous avez besoin pour vous connecter à MongoDB. Vous pouvez vérifier la configuration par défaut dansconfig/packages/doctrine_mongodb.yaml. Pour vous connecter à votre base de données, mettez à jour leMONGODB_URLvariable d'environnement dans votre.envdéposer.

Documents de mappage

Le premier document que nous cartographierons sont les données de la station. Créer un nouveauDocument\Stationclass et ajoutez des champs pour tout ce que nous devons stocker :

?php declare(strict_types=1); namespace App\Document; use App\Document\Partial\AbstractStation; use App\Repository\StationRepository; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ODM\MongoDB\Mapping\Annotations\Document; use Doctrine\ODM\MongoDB\Mapping\Annotations\EmbedOne; use Doctrine\ODM\MongoDB\Mapping\Annotations\Field; use Doctrine\ODM\MongoDB\Mapping\Annotations\Id; use Doctrine\ODM\MongoDB\Mapping\Annotations\Index; use GeoJson\Geometry\Point; use Symfony\Component\Uid\Uuid; use Symfony\Component\Uid\UuidV4; #[Document(repositoryClass: StationRepository::class)] #[Index(keys: ['location' ='2dsphere'])] class Station { #[Id(type : 'uuid', stratégie : 'none')] public readonly Uuid $id; #[Champ] chaîne publique $name ; #[Champ] chaîne publique $marque ; #[Field(type: 'point')...
[Courte citation de 8% de l'article original]
Loading...