Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony Twig render controller

    13 janvier 2019 à 11:58:52

    Salut les zéros!

    J'utilise dans une vue 3 render controller. Les deux premiers fonctionnent très bien mais pas le troisième.

    Pour info les routes ne sont pas définies donc impossible d'utiliser render url.

    Ci-dessous mon code:

    {% extends 'base.html.twig' %}
    
    {% block stylesheets %}
    {% endblock stylesheets %}
    
    {% block body %}
        <div id="wrapper">
            <div id="container">
                <div>{{ blog.description }}</div>
    
                <div>{{ render(controller('DoctrineBehaviorsBundle:Comment:form', {'object': blog})) }}</div>
    
                <div>{{ render(controller('DoctrineBehaviorsBundle:Comment:list', {'object': blog})) }}</div>
    
                {# works find if I passed object, but I don't need it #}
                <div>{{ render(controller('DoctrineBehaviorsBundle:Comment:statistic', {'object': blog, 'order': 'DESC'})) }}</div>
    
                {# doesn't works #}
                <div>{{ render(controller('DoctrineBehaviorsBundle:Comment:statistic', {'order': 'DESC'})) }}</div>
    
            </div>
        </div>
    {% endblock %}
    
    {% block javascripts %}
    {% endblock javascripts %}
    /**
         * @param string $order
         * @return \Symfony\Component\HttpFoundation\Response
         */
        public function statisticAction($object = null, $order = 'DESC')
        {
            $stats = $this->getDoctrine()->getRepository(CommentRecord::class)->fetchStatistics($order);
    
            return $this->render('@DoctrineBehaviors/comment/statistic.html.twig', [
                'stats' => $stats,
            ]);
        }

    Je ne vois aucune différence avec https://symfony.com/doc/3.4/templating/embedding_controllers.html.

    Merci pour votre aide.


    • Partager sur Facebook
    • Partager sur Twitter

    Celui qui aime à apprendre est bien près du savoir " Confucius

      14 janvier 2019 à 9:08:54

      Salut !

      C'est plus une question de pur PHP que de Symfony ou Twig, si je comprends bien.

      Tu as des paramètres optionnels pour ton action. Tu souhaites ne passer que l'ordre, qui est le second paramètre optionnel. Comment est-ce que PHP pourrait savoir que le seul paramètre que tu passes est le second dans l'ordre de déclaration ?

      En PHP, quand il y a plusieurs paramètres optionnels dans la signature d'une fonction ou d'une méthode, si tu dois renseigner le dernier, il faut donner des valeurs pour tous ceux qui précèdent, malgré les "valeurs par défaut". Twig, qui fonctionne avec du PHP et est donc pensé pour des personnes familières avec la manière de fonctionner de ce langage, reproduit le même comportement.

      C'est comme si tu voulais un escalier avec seulement une des marches, mais pas sa ou ses précédentes… Et surtout dans le cas où il devrait y en avoir plusieurs avant, tu veux laquelle exactement ?
      Même si le nom est donné dans Twig avec l'index du tableau, PHP ne fait pas le lien quand il exécute l'appel… Et Twig n'est pas prévu pour effectuer une opération de réflexion sur la méthode appelée afin d'extraire les éventuels paramètres et valeurs manquantes.

      Donc si tu veux avoir une marche, prévois qu'il faille renseigner les précédentes  ^^

      • Partager sur Facebook
      • Partager sur Twitter
        14 janvier 2019 à 20:27:23

        Salut,

        Oui ce fut une erreur de ma part lors du copier mais le paramètre optionnel était bien à la fin.

        Ceci dit je l'ai supprimé car je n'en ai absolument pas besoin et malgré cela le render ne ce fait pas. Tu coup après j'ai mis $object et là au miracle tout fonctionne. ;-)

        Mais ce que je ne comprend toujours pas c'est pourquoi lui, alors que tous les autres fonctionnent, et pourquoi le profiler me dis status 202 alors que les autres ont un status à 200.

        Alors si tu as d'autres idées je prends volontiers @Ymox

        A+

        • Partager sur Facebook
        • Partager sur Twitter

        Celui qui aime à apprendre est bien près du savoir " Confucius

          15 janvier 2019 à 9:05:39

          202 est un statut particulier, même s'il signifie que la requête a abouti. En gros, c'est pour spécifier que la requête principale peut être traitée, mais que les parties avec {{ render(…) }} ne sont pas gérées avec la même requête, et donc que la réponse principale ne peut pas garantir la réponse globale.
          Ce qu'il faut savoir avec {{ render(…) }}, c'est que Symfony va simuler une requête interne pour rendre ce que tu lui demandes. Quatre {{ render(…) }} ? Quatre "sous-requêtes" qui ne dépendent que de la requête maître, mais qui ne sont pas inter-dépendantes. J'imagine que suivant la configuration du serveur, il peut faire de la réponse un flux et afficher les éléments au fur et à mesure, et donc risque de répondre 202 avant même de savoir si le premier {{ render(…) }} a fonctionné — et quand bien même, s'il ne fonctionnait pas, je ne pense pas que tu aurais une erreur, ce qui est apparemment ton cas actuellement.

          Je crois avoir répondu à tes deux question, non ?

          • Tu ne peux pas passer qu'un paramètre optionnel qui ne soit pas le premier déclaré pour la fonction/méthode ;
          • Le statut HTTP 202 vient du mécanisme interne de Symfony avec des "sous-requêtes".

          -
          Edité par Ymox 15 janvier 2019 à 9:06:19

          • Partager sur Facebook
          • Partager sur Twitter
            20 janvier 2019 à 11:30:29

            Salut,

            Merci pout ta reponse @ymox.

            Je viens de faire un nouveau test avec une nouvelle action de controller testAction qui me renvoie une simple vue.

            A savoir l'ordre des variables, facultative ou pas n'a pas d'importance car le cohérence se fait par le nom de la variable.

            Mais bon bref, j'ai donc fait testAction sans arguments et flop total la vue n'est pas rendu. Par contre si j'injecte en argument une variable object ou id de la requête parent cela fonctionne parfaitement bien.

            Je pense donc plus à un bug.

            A ce stade je suis donc toujours bloqué.

            A+.

            • Partager sur Facebook
            • Partager sur Twitter

            Celui qui aime à apprendre est bien près du savoir " Confucius

            Symfony Twig render controller

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown