Metalovichinkov |
Voir le profil public |
Trouver plus de messages par Metalovichinkov |
Aller à la page... |
[PHP - Symfony]Construire une entité à partir de plusieurs tables.
Suivre Répondre |
|
Partager | Rechercher |
|
Sauf erreur, ce que tu veux faire correspond au chapitre association de la doc :
http://symfony.com/doc/current/book/...s-associations Pour ce genre de truc, pense d'abord en terme base de données pour ta recherche google, ce que tu veux faire c'est une jointure relationnelle de type 1 pour n (one to many). Et de préférence avec les termes anglais : tu aurais trouvé cette doc dans les premiers liens |
![]() |
|
Metalovichinkov |
Voir le profil public |
Trouver plus de messages par Metalovichinkov |
Alpha & Oméga
|
Nope c'est pas si simple vu que visiblement tu veux pas créer une entité et une relation mais une entité qui couvre 2 tables. Je suis pas un pro de doctrine mais ça me semble pas possible.
Imo il faudrait voir à changer ton modèle de donné qui me semble assez chelou (tu as vraiment besoin d'une table "stats" à part ? Visiblement tuvpeux fusionner l'entité "stats" et l'entité "pokémon"). Si tu veux vraiment séparer les choses dans ton code, peut-être te tourner vers des Value Object et des embed Doctrine : http://doctrine-orm.readthedocs.org/...beddables.html (attention je crois que c'est dans une version de Doctrine supérieure à celle par defaut dans Symfony) Edit : visiblement c'est pas impossible, http://docs.doctrine-project.org/en/...le-inheritance |
![]() |
|
Metalovichinkov |
Voir le profil public |
Trouver plus de messages par Metalovichinkov |
|
Si vous voulez voir, la DB se trouve en bas de page ici
En toute honnêteté, j'ai jamais bossé avec une DB de cette taille, et jamais avec une DB déjà remplie du coup je suis totalement perdu ![]() Dans l'absolu nan, je n'ai rien à recoder, je répondais à Edel qui disait que le modèle est chelou (et ça je l'admet) et c'est aussi pour ça que l'idée de faire une vue me plait moyennement, même si je ne voyais que ça... Ou alors faire beaucoup d'entité, vraiment beaucoup : rien que pour les pokémons (id, numéro pokédex selon les différentes région, pokémon parents, attaques, attaque transmises par reproduction, etc... Y'a beaucoup de trucs dans Pokémon ![]() A ça faut ajouter quelques tables pour les attaques, pour les objets, etc... Après, si le plus simple (et pas trop sale) est de faire une entité pour chaque table en découpant dans différents bundle (bundle pokémon, attaques, objets, etc...) bah je pense que je peux en être capable, mais je sais pas, je trouvais pas ça bien propre ![]() Je vous ajoute un lien vers la DB en mysql pour ceux qui veulent observer : ici |
![]() |
|
Metalovichinkov |
Voir le profil public |
Trouver plus de messages par Metalovichinkov |
|
Les entités c'est une chose, les bundles et la façon de coder le code métier s'en est une autre.
Les entités doivent être faites de façon à : - pouvoir ressortir les valeurs de tous les champs de ta bdd - te faciliter la vie en faisant les bonnes relations Les bundles et le découpage du code métier, c'est appliquer des bonnes pratiques et penser réutilisation et clareté. Il y a une commande Symfony pour faire du reverse ingeneering et créer les entités à partir de la database, par contre il faudra surement que tu repasses sur certaines entités pour les compléter et améliorer/optimiser. Je pense que tu devrais y aller étape par étape, déjà tu mets en place ton projet symfony avec un bundle entités par exemple qui contiendra toutes les entités de cette base. Ensuite tu penseras à tes classes et bundles pour t'organiser. Pour moi tes bundles ne doivent pas forcément être liés à une entité, surtout que tu risques, en codant, de te rendre compte que tu as besoin de la même entité dans 2 bundles différents et là ça deviendra moche. Perso je fais mon controller, par exemple : DisplayPokemonAction() : je veux qu'il affiche un pokemon. Ce controller appellera les méthodes de la classe Pokemon et cette classe fera appelle aux entités et aux requêtes faites dans les repository de ces entités afin de ressortir les données. Si tu as peur que ta classe Pokemon soit trop grosse, tu sépares tout ce qui est stat dans PokemonStat et ta classe Pokemon ira appeler des méthodes de PokemonStat pour ressortir tout ce qu'il te faut. Tu peux faire aussi des classes PokemonImage, PokemonSoud, PokemonZone ou whatever pour bien séparer tes méthodes mais au final je pense qu'il faudra que tu récupères la donnée que tu veux de la manière suivante dans ton controller : $this->Pokemon->getZone($idPokemon) et basta. Dernière modification par N3o- ; 21/12/2015 à 11h50. |
![]() |
|
Metalovichinkov |
Voir le profil public |
Trouver plus de messages par Metalovichinkov |
|
Citation :
|
![]() |
|
|
Je compléterai la réponse de N3o- en précisant que dans Symfony TOUT est objet et donc, tu utilises exclusivement des classes.
Une idée d'organisation peut-être à creuser car je l'utilise systématiquement sur l'ensemble de mes projets et j'en suis satisfait : - une classe entité par table - une classe repository par entité dans lesquelles tu mets tes requêtes spécifiques (en plus des find dont ces classes héritent) - une classe manager par entité que tu déclares comme service dans lesquelles tu mets toutes tes actions métiers concernant cette entité - une classe manager par "multi-entités" (ou hors-usage d'entités mais c'est pas courant) que tu déclares comme service si le besoin s'en fait sentir et que tu ne sais pas vraiment où classer ce manager (bon, ça c'est moche+++ mais ça dépanne) Avec cette organisation, tu réunis dans ces classes l'ensemble de ton code métier. Ainsi, dans ton controller, tu as juste à faire : $entiteManager = $this->get('monManager'); puis pour faire un select sur ta base : $mesResultats = $entiteManager->findMesInfosAvecUneRequeteHyperCompliqueQueJaiEcritDansUnRepository(); ou pour modifier tes données : $entiteManager->lanceSuperAttaque($assaillant, $victime, array $pleinDOptions); Cette méthode est très bien détaillée sur la page ci-dessous et me semble éminemment pratique : http://www.lafermeduweb.net/tutorial...fony2-p99.html |
![]() |
|
Metalovichinkov |
Voir le profil public |
Trouver plus de messages par Metalovichinkov |
|
Pas exactement, le main ce serait plutôt le web/app.php ou web/app_dev.php. C'est ce qu'on appelle le point d'entrée.
Le contrôleur te permet de résoudre une "request" (via une route) en vue de retourner une "response". Idéalement, son rôle devrait se limiter strictement à ça et tout le reste devrait être codé dans des services, le contrôleur n'étant que le chef d'orchestre qui appelle tout ton code. Tu peux très bien écrire un formulaire dans un contrôleur mais c'est dommage de ne pas utiliser un Form/type. Si tu vises une organisation "propre" (et c'est ce qui est le plus formateur et le plus simple à maintenir à l'avenir), essaies de conserver la règle des 5/10/20 dans chacun de tes contrôleurs c'est à dire : - 5 variables maximum par méthode - 10 méthodes maximum par contrôleur - 20 lignes maximum par méthode - (je rajouterai : 3 niveaux d'imbrication (if, for, ...) maximum par méthode mais ça c'est personnel) http://symfony.com/doc/current/best_...ces/index.html Si tu as un peu de temps et que ça t'intéresses, je t'invite à suivre les vidéos de dev&click qui a su vulgariser Symfony 2 : https://www.youtube.com/playlist?lis...weDKNMNQhHDbTT Je pense que tu focalises un peu trop sur les bundles et pour le coup, je me dis que tu devrais plutôt focaliser sur ce qu'ils contiennent et n'utiliser qu'un seul bundle pour ton application. Je te rappelle ce qu'en disent les bonnes pratiques Symfony 2 : Citation :
Sache également qu'on peut très bien utiliser Symfony 2 de manière très organisée tout comme mettre tout en vrac dans ton contrôleur. Lorsqu'on me confie un petit projet, il m'arrive assez régulièrement de nettement surcharger le code de mes contrôleurs de façon à pisser la ligne et de sortir rapidement la maquette attendue par mes clients. Il ne faut pas en avoir honte, ça fonctionne parfaitement, c'est juste plus difficile à lire, à réutiliser et à maintenir. Lorsque tu développes comme ça, très rapidement tu vas sortir un voter, un form et des actions métiers et tu les rangeras naturellement dans des classes spécifiques dès que le besoin de réutilisation se fera sentir. Dans tous les cas, la mise en production devra passer par la rationalisation du code sous peine de passer quelques nuits blanches dans 6 mois quand ton client te demanderas de modifier un comportement ![]() Comme je le dis souvent à mes stagiaires : "Quand tu pisses la ligne, selon les contraintes imposées, il y a toujours énormément de façon de coder : la bonne et les autres" ![]() |
![]() |
|
Alpha & Oméga
|
Trop gros pour JoL.
http://s000.tinyupload.com/?file_id=...77765335216488 php bin/console router:debug pour les routes. J'ai fait TRES vite mais ça fait le taff et devrait te lancer. Hésite pas si t'as des questions ! |
![]() |
|
Metalovichinkov |
Voir le profil public |
Trouver plus de messages par Metalovichinkov |
Suivre Répondre |
Connectés sur ce fil1 connecté (0 membre et 1 invité)
Afficher la liste détaillée des connectés
|