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 :

Comment bien découper son code ?


Sujet :

Symfony PHP

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Avril 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant en technologies

    Informations forums :
    Inscription : Avril 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Comment bien découper son code ?
    Bonjour à tous,

    Je suis à la recherche de conseils pour découper mon code sur SF2. (Pour information, je suis un développeur PHP confirmé mais débutant sur cette techno)

    Je vous expose mon problème :
    Sur mon application, il y a un bloc qui se répète à plusieurs endroits sur la même page (avec des données récupérées via Doctrine).

    Je vais prendre l'exemple de ma home page qui utilise indexAction() et le template index.html.twig

    1. J'ai tout d'abord utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    {# index.html.twig #}
    {{ render(controller("Bundle:Controller:block")) }}
    Comme je m'en doutais blockAction() est exécuté 2 fois, et donc les requêtes également ! J'ai réalisé mes tests en mode dev, il est possible que SF2 gère ce problème avec du cache en mode prod... N'hésitez à me reprendre si je fais fausse route

    2. J'ai ensuite testé un autre découpage :
    Avec une inclusion simple et en transmettant mes données depuis indexAction()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    {# index.html.twig #}
    {% include "@Bundle/block.html.twig" %}
    J'arrive à m'en sortir (les variables sont accessibles dans le template inclus bloc.html.twig), mais je n'aime pas trop cette solution car il faut que je transmette les données sur toutes les pages.

    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
     
    /* Pour indexAction() */
     
    return $this->render(
        'Bundle:index.html.twig',
        array(
            'data' => $this->getData(),
        )
    );
     
    /* Pour pageXAction() */
     
    return $this->render(
        'Bundle:pagex.html.twig',
        array(
            'data' => $this->getData(),
        )
    );
     
    /* NB : getData() récupère mes données via Doctrine */
    Je ne connais pas les best practices... Peut être que ce que je fais est une hérésie !
    Et vous, comment faites-vous quand vous êtes confronté à ce problème ?

    Merci d'avance pour vos retours.
    Bon début de semaine à tous !

  2. #2
    Membre averti
    Avatar de phpiste
    Homme Profil pro
    Développeur Senior
    Inscrit en
    Septembre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Senior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 251
    Points : 445
    Points
    445
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    J'ai confronté ce problême pas male de fois et j'avoue que c'est pas évident,
    ton code est correct sauf que parfois y'a des use case ou on a pas besoin réelement de rendre des controlleurs

    pour info y'a plusieurs façons pour inclure des bloques dites répétitives dans twig.

    http://twig.sensiolabs.org/doc/tags/include.html
    http://twig.sensiolabs.org/doc/tags/use.html
    http://twig.sensiolabs.org/doc/tags/embed.html
    https://sonata-project.org/bundles/b...tallation.html

    Use cas 1
    Imaginons que j'ai un partial qui contient des messages bêtes de type notices/success (flashBag)
    et je veux bien les gérér dans un template à part dont voici le contenu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {% block foot_script %}
        {% for flashMessage in app.session.flashbag.get('notice') %}
            <script type="text/javascript">
            $.growl.notice($.extend(defaultGrowlOptions, { message: "{{ flashMessage }}" }));
            </script>
        {% endfor %}
     
        {% for flashMessage in app.session.flashbag.get('error') %}
            <script type="text/javascript">
            $.growl.error($.extend(defaultGrowlOptions, { message: "{{ flashMessage }}" }));
            </script>
        {% endfor %}
    {% endblock %}
    je dois inclure ce bou de code dans toutes mes pages or il contient du JS dépendant de la lib js growl et du jquery

    j'utilise donc un use pour faire de l'inclusion horisontale (enfin je doute que c'est la bonne traduction)

    http://twig.sensiolabs.org/doc/tags/use.html

    du coups dans mon layout générale je fais appelle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {% use "MyDemoBundle:Partial:notices.html.twig" with foot_script as flash %}
    ......
    ......
    {% block foot_script %}
        {{ block('flash') }}
    {% endblock %}
    Use cas 2
    Imaginons maintenant que mon besoin a évoluer et que j'ai dois mêttre en place un formulaire pour donner son avis sur le message affiché
    du coups y'a une logique métier derriere pour: afficher, envoyer et traiter le donnée issue du form

    là tu dis
    "mais je n'aime pas trop cette solution car il faut que je transmette les données sur toutes les pages."

    tu peux déclarer ton formulaire en temps que variable globale avec une extension twig (tu dois la déclaré en temps que service tagué)
    et qui a l'alure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    .....
    class DemoExtension extends \Twig_Extension
    {
        public function getGlobals() 
        {
     
            return [
                'flash_form' => $this->formFactory->createForm(new MyDemoForm())->createView()
            ];
        }
     
    Regarde ce lien pour plus d'information sur les extensions twig
    http://symfony.com/fr/doc/current/cookbook/templating/twig_extension.html


    du coups la variable flash_form est disponible globalement dans toutes les templates

    ensuite tu peux envoyer en ajax le formulaire pour isoler le traitement dans une action à part

    Rendre directement des controlleurs n'est pas bêtes de tous mais comme tu l'a dis y'a nouveau objet sub request est crée et c'est pourcela des mécanismes de chargement de contenu asynchrone "esi" sont utilisé pour améliorer les perfs

    enfin y'a un excélent bundle qui est fait juste pour résoudre cette problématique

    SonataBlockBundle
    https://sonata-project.org/bundles/b...tallation.html


    y'a une section dans symfony2 doc qui peut être utile

    http://symfony.com/fr/doc/current/bo...ing-controller

    Bonne chance
    Je suis Développeur Senior ouvert aux opportunités
    Mon blog

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Avril 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant en technologies

    Informations forums :
    Inscription : Avril 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour ton retour !

Discussions similaires

  1. Comment bien déboguer son code ?
    Par D[r]eadLock dans le forum Débuter
    Réponses: 47
    Dernier message: 02/04/2024, 16h06
  2. [VBA][Excel] Comment bien structurer son code?
    Par skystef dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/03/2007, 19h39
  3. [mise en page] pour bien indenter son code
    Par bihorece dans le forum C++Builder
    Réponses: 4
    Dernier message: 06/08/2003, 16h14

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