Использование компонента формы Symfony4 Standalone с Twig и расширением формы - PullRequest
0 голосов
/ 26 сентября 2018

Я настраиваю среду, в которой в качестве основы используются некоторые компоненты Symfony.

Я хотел бы использовать компонент Form в качестве диспетчера форм приложения с Twig для шаблона.Я устанавливаю: form, twig и twig_bridge

Поскольку у меня есть этот ограниченный набор компонентов, я зарегистрировал класс RuntimeLoader на Twig для управления зависимостями расширения формы через FormRenderer.

После настройкипростой тест с базовой формой, как описано в документации: https://symfony.com/doc/current/forms.html Я получаю эту ошибку:

An exception has been thrown during the rendering of a template ("No block "form_start" found while rendering the form.").

Вся моя работа начинается здесь:

 //templating index.php
 $twigLoader = new \Twig_Loader_Filesystem( getcwd() . '/Templates' );
 $twig = new \Twig_Environment( $twigLoader );
 $twig->addRuntimeLoader( new RuntimeLoader( $twig ) );
 $twig->addExtension( new FormExtension() );

RuntimeLoaderаналогично описанному в документации по веткам: https://twig.symfony.com/doc/2.x/advanced.html#creating-an-extension Используется для учета зависимости узлов FormExtension от класса FormRenderer (для этого в Symfony Framework используется служба)

namespace Forge\UI;

use Twig\RuntimeLoader\RuntimeLoaderInterface;
use Symfony\Bridge\Twig\Form\TwigRendererEngine;

class RuntimeLoader implements RuntimeLoaderInterface {

 private $twig;

 public function __construct( $twig ) {
  $this->twig = $twig;
 }

 public function load( $class ) {
  //var_dump( $class );
  if ( 'Symfony\Component\Form\FormRenderer' === $class ) {
   return new $class( new TwigRendererEngine( [ 'form.html.twig' ], $this->twig )     );
  }
 }
}

ТогдаВ конце концов, в классе контроллера я называю весь суп:

  $task = new Task();
  $task->setTask( 'Make somebody happy' );

  $form = $this->createFormBuilder( $task )
   ->add( 'task', TextType::class )
   ->add( 'save', SubmitType::class, [ 'label' => 'Create Task' ] )->getForm();

  $content = $this->renderView( 'form.html.twig', [ 'form'=>$form->createView() ] );

Это выдает ошибку:

object(Twig_Error_Runtime)#258 (12) {
  ["lineno":"Twig_Error":private]=>
  int(1)
  ["name":"Twig_Error":private]=>
  string(14) "form.html.twig"
  ["rawMessage":"Twig_Error":private]=>
  string(122) "An exception has been thrown during the rendering of a template ("No block "form_start" found while rendering the form.")."
  ["sourcePath":"Twig_Error":private]=>
  string(58) "/var/www/../Templates/form.html.twig"
  ["sourceCode":"Twig_Error":private]=>
  string(0) ""
  ["message":protected]=>
   string(122) "An exception has been thrown during the rendering of a template ("No block "form_start" found while rendering the form.")."
  ["string":"Exception":private]=>
  string(0) ""
  ["code":protected]=>
  int(0)
  ["file":protected]=>
   string(58) "/var/www/../Templates/form.html.twig"
  ["line":protected]=>
  int(1)

исходный путь ошибки - простой шаблон ветки:

{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}

Как мне избавиться от исключения?PS Я не хочу устанавливать все пакеты Symfony.

...