web-dev-qa-db-ja.com

Symfony 3.4バンドル内でビューを使用する

Symfony 3.4を使用した新しいリポジトリの設定に問題があります。最後のLTS(3.4)でsymfonyコマンドを作成し、コマンドを使用して新しいバンドルを追加しました。新しいバンドルは正常に機能しますが、このバンドル内に保存されているビューを使用できません。

私のバンドルの構造を示します:

structure

このindex.html.twigをコントローラーで次のように使用したいと思います。

<?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');
    }
}

しかし、レンダリングしようとすると、このエラーが発生します。

テンプレート "ListerListerBundle:Default:index.html.twig"を見つけることができません(/ 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)。

私の言うことは理解しています、私のフォルダはsymfonyが私のビューを検索する場所ではありませんが、「ListerBundle/Ressources/views」でSymfonyに言う方法が見つかりません

私の最も古いプロジェクトでは、他の構成なしで機能していました。

情報:バンドルを再利用可能なバンドルとして使用します。

よろしく、

PS:これはcomposer.jsonの自動ロード部分です

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

PSS:My 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(),
    ];
...

そしてまた:ここに私の依存性注入

enter image description here

そして、ファイルの内容:

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:@Ceradから

@ ListerLister/Default/index.html.twig

@Ceradからの元の応答

何らかの理由で、S3.4は、twigパスを指定するためのBundle:Dir:nameアプローチを好まなくなり、generate:bundleコマンドはまだ更新されていません。バグかどうかは不明です上記の@ ListerLister/Default/index.html.twigパスが機能するはずです。bin/ console debug:twigを試してtwig名前空間パスを確認してください。– Cerad

8
David Allios

基本的な問題は、S3.4では、twig 'ListerListerBundle:Default:index.html.twig'などのテンプレートパスがサポートされなくなったことです。

コントローラーのパスを次のように置き換えます。

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

そして、すべてがうまくいくはずです。実際のネームスペースプレフィックスが何であるかわからない場合は、次を実行します。

bin/console debug:twig

それらをリストします。

S3.3は引き続き正常に動作するため、これは3.4で変更されたものです。とにかく名前空間形式を使用することになっているので、これは大したことではありません。

これに関する問題をgithubに提出しました: https://github.com/sensiolabs/SensioGeneratorBundle/issues/587

メンテナの発言を確認します。

更新:偉大で強力なFabpot自身が私の問題に答えました。テンプレートに 'ListerListerBundle:Default:index.html.twig'形式を使い続けたい場合は、app/config/config.ymlファイルを編集します。

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

これは、古い形式を引き続き使用するレガシーコードがある場合にのみ行う必要があります。すべての新しいコードにtwig名前空間を使用します。

36
Cerad