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 :

[Twig] Création d'une extension et injection de dépendances [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut [Twig] Création d'une extension et injection de dépendances


    Petit problème lors de la création d'une extension Twig : comment faire pour que Sf2 la reconnaisse ? Il semble qu'il faille jouer avec les injections de dépendances, domaine qui me reste assez flou...

    Pour faire simple, j'ai copié ce qui se faisait dans le AcmeBundle : dans mon bundle, j'ai un dossier Twig > Gabarit > GabaritExtension.php, avec mon extension.

    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
    <?php
     
    namespace Quiz\QuizBundle\Twig\Gabarit;
     
    use Symfony\Component\HttpKernel\KernelInterface;
    use Symfony\Bundle\TwigBundle\Loader\FilesystemLoader;
     
    class GabaritExtension extends \Twig_Extension
    {
        // ...
     
        public function getFilters()
        {
            return array(
                'gab_right' => new \Twig_Filter_Method($this, 'gabRight', array('is_safe' => array('html'))),
            );
        }
     
        // ...
    }
    exit;
    Remarquez le exit; à la fin : il ne fait rien... Si je mets un var_dump juste avant, il ne m'affiche rien non plus, je crains que Sf2 n'aille jamais regarder le contenu de ce fichier...

    J'ai suivi l'exemple avec un dossier DependencyInjection à la racine de mon bundle, avec ce contenu :

    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
    <?php
     
    namespace Quiz\QuizBundle\DependencyInjection;
     
    use Symfony\Component\HttpKernel\DependencyInjection\Extension;
    use Symfony\Component\DependencyInjection\ContainerBuilder;
    use Symfony\Component\DependencyInjection\Definition;
     
    class GabaritExtension extends Extension
    {
        public function load(array $configs, ContainerBuilder $container)
        {
            $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
            $loader->load('services.yml');
        }
     
        public function getAlias()
        {
            return 'gabarit';
        }
    }
    Et le fichier de configuration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    services:
        twig.extension.twigext:
            class: Quiz\QuizBundle\Twig\Gabarit\GabaritExtension
            tags:
                - { name: twig.extension }
    Comment faire que mon extension soit chargée ? Où faut-il enregistrer l'injection de dépendances (je crains que ce ne soit ça qui manque, car un exit; dans le fichier d'injection ne fait rien non plus) ?

    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Salut,

    L'injection de dépendance demande que les conventions de nommage soient bien respectées... ce que tu ne fais pas ! :p

    Pour que ton bundle soit géré comme une extension, il faut que ton fichier et ta classe extension porte le nom QuizQuizExtension (le nom de ton bundle en remplacant bundle par extension) au lieu de ton GabaritExtension actuel.
    Soyons bien d'accord : avec ce code c'est ton bundle qui devient une extension a sf2 et qui lui permet d'avoir une configuration avancée (ici, définition de ton extension twig en tant que service).

    Pour info elle fait quoi ton extension twig ?

  3. #3
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    Citation Envoyé par winzou Voir le message
    Pour que ton bundle soit géré comme une extension, il faut que ton fichier et ta classe extension porte le nom QuizQuizExtension (le nom de ton bundle en remplacant bundle par extension) au lieu de ton GabaritExtension actuel.
    Tu parles du fichier d'injection de dépendances ou bien du fichier d'extension en lui-même ? J'ai renommé les deux en QuizQuizExtension en faisant les modifs qui vont bien (nom de classe et services.yml), sans que ça ne change grand chose, Twig plante toujours sur un filtre non trouvé et mes exit; ne font rien du tout...

    Citation Envoyé par winzou Voir le message
    Pour info elle fait quoi ton extension twig ?
    Pour l'inclusion d'un gabarit commun à tout le site (c'est-à-dire le même sur tous les serveurs, toutes les applications tierces installées - parfois même avec un mix de Java et de Ruby...). Tout se fait avec des inclusions de fichiers PHP et quelques variables bien définies, ce que Twig n'apprécie guère... C'est donc du très spécifique.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Dans ton répertoire Quiz\QuizBundle\DependencyInjection tu dois avoir un fichier QuizQuizExtension.php qui contient la classe QuizQuizExtension extends Extension. Cette classe transforme ton bundle en "extension symfony", ce qui te permet de charger ton fichier services.yml.

    Donc, si tu mets un var_dump/exit/whatever dans la méthode load ca fait qqch ou pas ?

    Uhm et puis rajoute aussi dans ce fichier ces use :
    use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
    use Symfony\Component\Config\FileLocator;

  5. #5
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    Citation Envoyé par winzou Voir le message
    Donc, si tu mets un var_dump/exit/whatever dans la méthode load ca fait qqch ou pas ?
    Rien du tout . J'ai donc le fichier src/Quiz/QuizBundle/DependencyInjection/QuizQuizExtension.php avec ce contenu :

    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
    <?php
     
    namespace Quiz\QuizBundle\DependencyInjection;
     
    use Symfony\Component\DependencyInjection\ContainerBuilder;
    use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
    use Symfony\Component\HttpKernel\DependencyInjection\Extension;
    use Symfony\Component\Config\FileLocator;
     
    class QuizQuizExtension extends Extension
    {
        public function load(array $configs, ContainerBuilder $container)
        {
            $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
            $loader->load('services.yml');
            var_dump(42);exit;
        }
     
        public function getAlias()
        {
            return 'gabarit';
        }
    }
    exit;
    Aucun des deux exit; ne fait quelque chose.

    Si ça peut être utile, je teste ça avec un route

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    homepage:
        pattern:  /42/
        defaults: { _controller: QuizBundle:Default:index }
    dans le routing.yml du dossier app, qui donne sur le fichier Quiz/QuizBundle/Controller/DefaultController.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
     
    namespace Quiz\QuizBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
     
    class DefaultController extends Controller
    {
        public function indexAction()
        {
            return $this->render('QuizBundle:Default:index.html.twig');
        }
    }
    qui appelle la vue Quiz/QuizBundle/Resources/views/Default/index.html.twig

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    {{ "Qt"|gab_right }}
    Hello!
    Autre angle d'approche : je sais dès le contrôleur quel contenu afficher, précisément. Il devrait être possible de mettre ça dans les variables passées à la vue Twig parente, non ? (Avec sf1, ça n'était pas si facile de faire passer des choses du contrôleur au layout principal ; là, avec l'héritage, ça devrait être mieux).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    uhm je sais pas quoi te dire, j'ai la même config et ca marche chez moi, en beta1.

    Le seul point que je vois, c'est quand tu fais appel à ta vue : QuizBundle:Default:index. Ca devrait être QuizQuizBundle:Default:index non ? Du coup le fait que ca marche avec un seul Quiz m'inquiète un peu.

    Pour passer des vars au template parent je sais pas trop. Par contre ce que tu peux faire c'est passer des vars à un template que tu inclus. Ca dépend de ton organisation mais ca peut passer (tu fais appel au layout depuis le controller, avec une var $page qui inclus le bon template au milieu). C'est moins joli je te l'accorde.

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

Discussions similaires

  1. [PHP 5.3] La création d'une extension PHP
    Par Xavier.vdw dans le forum Langage
    Réponses: 0
    Dernier message: 23/08/2010, 17h47
  2. [GvSIG] Création d'une extension java sur Gvsig 1.9
    Par crypto dans le forum SIG : Système d'information Géographique
    Réponses: 1
    Dernier message: 17/05/2010, 22h47
  3. [eZ Publish 4.1] Création d'une extension
    Par nanu dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 22/12/2009, 15h39

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