web-dev-qa-db-fra.com

Symfony 3.4 Utiliser la vue à l'intérieur de mon bundle

J'ai des problèmes pour la configuration d'un nouveau référentiel utilisant Symfony 3.4. J'ai utilisé la commande symfony pour le créer avec le dernier LTS (3.4) et j'ajoute également une nouvelle commande Bundle using. Mon nouvel ensemble est en place et fonctionne bien, mais je ne peux pas utiliser la vue stockée à l'intérieur de cet ensemble.

Je vous montre la structure de mon Bundle:

structure

Je veux utiliser ce index.html.twig dans mon contrôleur comme ceci:

<?php

namespace Lister\ListerBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

class DefaultController extends Controller
{
    /**
     * @Route("/lister")
     */
    public function indexAction()
    {
        return $this->render('ListerListerBundle:Default:index.html.twig');
    }
}

Mais quand j'essaye de le rendre, j'ai cette erreur.

Impossible de trouver le modèle "ListerListerBundle: Default: index.html.twig" (examiné dans:/home/emendiel/Data/Code/Perso/WebLister/app/Resources/views,/home/emendiel/Data/Code/Perso/WebLister/vendor/symfony/symfony/src/Symfony/Bridge/Twig/Resources/views/Form).

Je comprends ce que ça veut dire, mon dossier n'est pas où symfony recherche ma vue mais je n'ai pas trouvé comment je peux dire à Symfony d'aller dans "ListerBundle/Ressources/views"

Dans mon plus ancien projet qui était de travailler sans autre configuration.

Info: J'utilise mon bundle comme bundle réutilisable.

Cordialement,

PS: Ceci est ma partie de chargement automatique dans composer.json

"autoload": {
    "psr-4": {
        "": "src/"
    },
    "classmap": [
        "app/AppKernel.php",
        "app/AppCache.php"
    ]
},

PSS: Mon AppKernel:

public function registerBundles()
{
    $bundles = [
        new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
        new Symfony\Bundle\SecurityBundle\SecurityBundle(),
        new Symfony\Bundle\TwigBundle\TwigBundle(),
        new Symfony\Bundle\MonologBundle\MonologBundle(),
        new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
        new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
        new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
        new AppBundle\AppBundle(),
        new Lister\ListerBundle\ListerListerBundle(),
    ];
...

Et encore: Voici ma dependencyInjection

enter image description here

Et le contenu des fichiers:

Configuration.php

<?php

namespace Lister\ListerBundle\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

/**
 * This is the class that validates and merges configuration from your app/config files.
 *
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/configuration.html}
 */
class Configuration implements ConfigurationInterface
{
    /**
     * {@inheritdoc}
     */
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('lister_lister');

        // Here you should define the parameters that are allowed to
        // configure your bundle. See the documentation linked above for
        // more information on that topic.

        return $treeBuilder;
    }
}

ListerListerExtension.php

<?php

namespace Lister\ListerBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader;

/**
 * This is the class that loads and manages your bundle configuration.
 *
 * @link http://symfony.com/doc/current/cookbook/bundles/extension.html
 */
class ListerListerExtension extends Extension
{
    /**
     * {@inheritdoc}
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');
    }
}

Solution: de @Cerad

@ ListerLister/Default/index.html.twig

Réponse originale de @Cerad

Pour une raison quelconque, S3.4 n'aime plus l'approche Bundle: Dir: name pour spécifier twig chemins et la commande generate: bundle n'a pas encore été mise à jour. Je ne sais pas s'il s'agit d'un bogue ou Le chemin @ ListerLister/Default/index.html.twig suggéré ci-dessus devrait fonctionner. Essayez le débogage bin/console: twig pour voir vos twig chemins d'espaces de noms. - Cerad

8
David Allios

Le problème de base semble être que dans S3.4, les chemins de modèle twig comme "ListerListerBundle: Default: index.html.twig" ne sont plus pris en charge.

Remplacez le chemin dans le contrôleur par:

'@ListerLister/Default/index.html.twig'

Et tout devrait aller bien. Si vous n'êtes jamais sûr de ce que le préfixe d'espace de noms réel est alors exécuté:

bin/console debug:twig

pour les énumérer.

S3.3 fonctionne toujours bien donc c'est quelque chose qui a changé en 3.4. Censé utiliser le format d'espace de nom de toute façon, ce n'est donc pas un gros problème.

J'ai signalé un problème à ce sujet sur github: https://github.com/sensiolabs/SensioGeneratorBundle/issues/587

Nous verrons ce que les mainteneurs ont à dire.

Mise à jour: Le grand et puissant Fabpot lui-même a répondu à mon problème. Si vous souhaitez continuer à utiliser le format 'ListerListerBundle: Default: index.html.twig' pour les modèles, modifiez votre fichier app/config/config.yml:

# app/config/config.yml
framework:
    templating:
        engines: ['twig']

Vous ne devez le faire que si vous disposez d'un code hérité qui utilise toujours l'ancien format. Utilisez twig namespaces pour tout nouveau code.

36
Cerad