IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Plusieurs Bundles dans une même page [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 21
    Par défaut Plusieurs Bundles dans une même page
    Bonjour à tous !

    Je crois que le titre parle de lui-même

    Je développe en php et je débute sous Symfony. Actuellement, je bloque sur cette question : comment faire pour utiliser 2 bundles différents sur une seule et même page ? Par exemple un bundle chat et un bundle météo ?

    Mon idée est de créer un Bundle Conteneur qui appellerait les bons bundles mais je ne sais pas bien comment m'y prendre.

    J'ai pas mal cherché sur le net et je n'ai pas trouvé de choses qui me semblait répondre à la question. Du coup je me demande si c'est que ma question est vraiment trop basique pour que quelqu'un l'ai posée avant moi ou si c'est que ma logique de développement n'est pas la bonne.

    En tous cas, je serais content d'avoir des avis ou conseils..

    Merci par avance !

  2. #2
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    yoooooooooooooo mannnn rastafriiiiiiiiiiiiiiiiiiiiiiiiiiiii


    * tout simplement avec des includes pour du simple html :

    grossièrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    include bundleChat/index.html.twig
    include bundleMeteo/index.html.twig
    * ou faire appel à un controleur dans la vue :

    grossièrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    {{ render(controller('AcmeArticleBundle:Article:chat', { 'max': 3 })) }}
    {{ render(controller('AcmeArticleBundle:Article:meteo', { 'max': 3 })) }}

  3. #3
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    ... euh oui : c'est une solution. Pas la plus élégante mais c'est une solution qui fonctionne.

    Disons que la solution de dukoid a l'avantage de pouvoir utiliser tes blocs météo et chat sous forme de widget grâce au render controller. Tu peux placer un bloc météo sur n'importe quelle page simplement juste en faisant ce render. Par contre ça a le gros inconvénient de te faire autant de cycles Request/Response qu'il y aura de render. Ce qui, sur des applications un peu plus lourdes, aura tendance à ralentir ton site.

    L'autre solution plus propre mais plus complexe :

    En réfléchissant sous forme de fonctionnalités, tu as un service de chat, et un service de météo. Ces services sont des classes managers, services, appelle les comme tu veux. Elles sont dans des bundles différents mais peuvent être injectés n'importe ou dans ton projet.

    Si ton bundle conteneur comporte un controller, auquel tu injectes le service de météo et le service de chat, la page sur laquelle tu veux les afficher possède déjà elle même les deux éléments différents dont elle a besoin. Tu n'as plus qu'à afficher le tout dans ta template sans appeler d'autres controllers.

    Le rendu de ton chat ou de ton bloc météo peut même être géré sous forme de macro s'il doit être réutilisé et présent à d'autres endroits du site.

    ++

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 21
    Par défaut
    Merci pour vos réponses.

    Je vais essayer de m'orienter vers la solution plus propre mais plus complexe (tant qu'à faire les choses bien).

    Si j'ai bien compris, l'idée est de spécifier un controller en tant que service comme décrit ici http://symfony.com/doc/current/cookb...r/service.html et de l'appeler depuis n'importe quel autre contrôleur comme une simple classe ?

    Suis-je sur la bonne voie ? Je tiens vraiment à prendre de bonnes habitudes dès le départ.

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Par défaut
    Tu as deux problème distinct: afficher le bout météo, qui sous entend quelque chose de peu complexe. Dans ce cas, pour garder des performances élevées, tu devrais regarder du coté des extensions twig et créer une fonction twig te générant ton bout de météo tu l'utiliserai par exemple comme ca: {{ meteo(today) }}
    Pour le bout de code de tchat, ca peut vide etre du code complexe. Il me semble inévitable d'utiliser les render controller(débutant) ou d'utiliser la solution de Nico, qui te demande de créer un controlleur de base dont étendent tous tes autres controlleurs, et ca c'est plus avancé deja).

    Extension twig > Maccro (injection de dépendance possible pour les extensions, moins chiant a utiliser aussi)
    embed > include (embed permet de redefinir seulement des blocs twigs du bloc inclus)


    Pour le contrôleur en tant que service, c'est sympa mais pas du tout obligatoire et ça t'apportera rien en tant que débutant.(c'est surtout interessant pour l'injection de dépendance)
    Par contre, si tu veux prendre un bon départ, tu devrais déléguer tout ton code métier dans un service, appelé par ton contrôleur.

  6. #6
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Quitte à prendre de bonnes habitudes, habitue toi à quasiment tout déclarer en tant que service : les contrôleurs, les forms, les managers, les subscribers tu peux quasiment tout déclarer en service.

    Concernant ton dernier message, ce n'est pas tout à fait ça : tu peux effectivement déclarer le contrôleur qui va afficher ces deux éléments en tant que service.
    Par contre pour le reste : ce ne sont plus des contrôleurs que tu vas appeler mais d'autres services qui vont te retourner ce qu'il te faut pour faire ton chat et ta météo.

    Imaginons que tu aies aujourd'hui un contrôleur qui envoie un ou plusieurs éléments pour ta météo à la template qui l'affiche. Ces données ne doivent pas être "calculées" dans un contrôleur : ce sont d'autres services (appelons les des managers pour faire simple) qui vont s'en occuper. Le contrôleur lui ne doit pas faire de traitement métier.

    Donc admettons qu'aujourd'hui ton code ressemble globalement à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class MeteoController {
     
        public function showAction()
        {
            $meteoManager = $this->container('service_meteo');
     
            $weather = $meteoManager->getWeather();
            $temperature = $meteoManager->getTemp();
     
            return array('temperature' => $temperature, 'weather' => $weather)
        }
     
    }
    C'est une supposition approximative.
    Le manager est un service qui va te permettre de récupérer les infos dont tu auras besoin pour faire le rendu dans la template (il a donc besoin d'être déclaré en tant que service). Ces données ne sont pas supposées être traitées et/ou modifiées dans le contrôleur.
    Tu es dans ton MeteoBundle, et ton contrôler fait ça. La template fait le rendu avec les variables température et weather.
    On va supposer que dans ton ChatBundle c'est globalement la même chose. (si ce n'est pas le cas et que tu n'as pas de manager, arrange toi pour que ça donne plus ou moins ça).

    Dans ton nouveau bundle, et ton nouveau contrôler : tu peux te contenter de ça et appeler via le container les deux services qui vont te retourner les éléments dont tu as besoin.
    Ou alors tu pousses le vice, et tu te débarrasses du container de service : ce qui signifie que tous les services que tu appelles via le container devront cette fois être injectés (ce qui signifie aussi que du coup ton contrôleur doit être également déclaré en tant que service).

    En résumé ça donnerait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    use xxx\MeteoBundle\Manager\MeteoManager;
    use xxx\ChatBundle\Manager\ChatManager;
     
    class MyController {
     
        protected $chatManager;
     
        protected $meteoManager;
     
        public function __construct(ChatManager $chatManager, MeteoManager $meteoManager)
        {
            $this->chatManager = $chatManager;
            $this->meteoManager = $meteoManager;
        }
     
        public function meteoAndChatAction()
        {
            $weather = $this->meteoManager->getWeather();
            $temperature = $this->meteoManager->getTemp();
     
            $chatWindow = $this->chatManager->generateChatWindow();
     
            return array(
                'chatWindow' => $chatWindow,
                'temperature' => $temperature,
                'weather' => $weather
            )
        }
     
    }
    Maintenant je m'explique : ce contrôleur n'a plus besoin d'étendre une classe container aware puisqu'on lui injecte tous les services dont il a besoin (les dépendance).
    Ces services te retournent les données qui te permettent de générer dans ta vue la partie météo et la partie chat.

    Tu as donc un seul contrôleur, une seul template et dans les bundles respectifs, les managers qui s'occupent du traitement.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 21
    Par défaut
    Merci Nico,

    Cela fait un moment que j'examine ta réponse et que je fais des tests et certaines choses me paraissent encore obscures (c'est parfois un peu frustrant de débuter).

    Je vais prendre les choses dans l'ordre :

    Dans ton exemple de la classe showAction, j'ai une erreur si je n'étend pas la classe comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class MeteoController extends Controller
    , tu ne l'as pas étendue parce que c'était juste un exemple ou il y a une subtilité que je n'ai pas comprise ?

    Par ailleurs, on est d'accord que dans cette class MeteoController, tu ne retournes pas de response ? J'ai aussi du mal à comprendre, je croyais qu'un controller devait toujours renvoyer une réponse ?

    Désolé, je me rends bien compte que ce sont les bases

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Plusieurs boutons dans une même page
    Par phpines dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 14/04/2009, 15h03
  2. Réponses: 0
    Dernier message: 01/07/2008, 16h16
  3. [XHTML] comment déclarer plusieurs doctypes dans une même page
    Par elsapascal dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 21/06/2008, 11h20
  4. Réponses: 11
    Dernier message: 07/08/2007, 17h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo