Использование автономного компонента формы Symfony4 с Twig и расширением формы

Я настраиваю среду, в которой в качестве основы используются некоторые компоненты 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) }}

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

Совершенно уверен, что вам нужно следовать документации создание шаблонов компонентов формы для настройки. Документы компонентов легко перепутать с документами фреймворка.

Cerad 26.09.2018 22:20

Спасибо за совет, не видел той страницы. Я решаю свою проблему, но для этого требуются еще 3 компонента (конфигурация, перевод, файловая система).

Mindexperiment 26.09.2018 23:33

Ага. К тому времени, когда вы получите все необходимое для совместной работы, вы в основном повторно реализовали пакет фреймворка.

Cerad 27.09.2018 00:11

Это давно известная «проблема»: компонент формы - один из самых глубоко связанных компонентов в структуре.

mblaettermann 27.09.2018 06:12

Найдите рабочий пример здесь: php.budgegeria.de/sbez1

Wolfgang Blessen 29.03.2019 10:50

Если кто-то действительно хочет решить эту проблему, я обнаружил, что теперь вы можете использовать twig-bridge из репозитория symfony для достижения этого результата, к сожалению, для этого требуется, чтобы вы использовали HttpFoundation / session для включения защиты Csrf в форме, которая не соответствует psr17 afaik

Jonathan dos Santos 07.04.2020 04:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
6
471
0

Другие вопросы по теме