Silex-Skeleton をベースに Twig テンプレートを使ってフォームを表示しようとしています。
公式ドキュメント(Form)を参考にしてひととおり作ったのですが、アクセスすると
Twig_Error_Runtime
Unable to load the "Symfony\Component\Form\FormRenderer" runtime.
in index.html.twig (line 5)
というエラーが表示されて先へ進めません。
問題を起こしているのは form_widget() の部分です。
php
1 <form action="#" method="post"> 2 {{ form_widget(form) }} 3 <input type="submit" name="submit" /> 4 </form>
コントローラー部分はこのようになっています。
php
1 public function index(Application $app, Request $request){ 2 3 $data = array( 4 'name' => 'Your name', 5 'email' => 'Your email', 6 ); 7 8 $form = $app['form.factory']->createBuilder(FormType::class, $data) 9 ->add('name') 10 ->add('email') 11 ->getForm(); 12 13 $form->handleRequest($request); 14 15 return $app['twig']->render('index.html.twig', array( 16 'form' => $form->createView() 17 )); 18 }
コントローラーの時点ではエラーは出ていないようです。
composer をつかって symfony/form や symfony/twig-bridge などのインストールは完了しているはずです。app.php にも FormServiceProvider などは register() してあります。また、vendor フォルダを見た限りでは FormRenderer.php は存在しています。
何が問題なのでしょうか?
【追記】
さらに根本を辿っていくと発生位置は Twig_Environment クラスの getRuntime() メソッドのようです。
php
1 public function getRuntime($class) 2 { 3 // エラー時 $this->runtimes は空の配列でした 4 if (isset($this->runtimes[$class])) { 5 return $this->runtimes[$class]; 6 } 7 8 // 通常はここで load() が成功しますが結果は null でした 9 // runtimeLoaders には1つの RuntimeLoader オブジェクトがセットされていました 10 foreach ($this->runtimeLoaders as $loader) { 11 if (null !== $runtime = $loader->load($class)) { 12 return $this->runtimes[$class] = $runtime; 13 } 14 } 15 16 throw new Twig_Error_Runtime(sprintf('Unable to load the "%s" runtime.', $class)); 17 }
エラー発生時、そのプロパティ runtimeLoaders は1つオブジェクトが登録されていますが、$loader->load($class)
の結果は null になっているようでした。
RuntimeLoader の mapping には下の2つが登録されています。
php
1 "Symfony\Bridge\Twig\Extension\HttpKernelRuntime" => "twig.runtime.httpkernel" 2 "Symfony\Bridge\Twig\Form\TwigRenderer" => "twig.form.renderer"
しかし、getRuntime($class)
での第1引数には Symfony\Component\Form\FormRenderer
が入っており、mapping 内に存在しないためロードに失敗しています。本来ならSymfony\Bridge\Twig\Form\TwigRenderer
が指定されていなければいけないように見えます。

あなたの回答
tips
プレビュー