Я настраиваю среду, в которой в качестве основы используются некоторые компоненты 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.
Спасибо за совет, не видел той страницы. Я решаю свою проблему, но для этого требуются еще 3 компонента (конфигурация, перевод, файловая система).
Ага. К тому времени, когда вы получите все необходимое для совместной работы, вы в основном повторно реализовали пакет фреймворка.
Это давно известная «проблема»: компонент формы - один из самых глубоко связанных компонентов в структуре.
Найдите рабочий пример здесь: php.budgegeria.de/sbez1
Если кто-то действительно хочет решить эту проблему, я обнаружил, что теперь вы можете использовать twig-bridge из репозитория symfony для достижения этого результата, к сожалению, для этого требуется, чтобы вы использовали HttpFoundation / session для включения защиты Csrf в форме, которая не соответствует psr17 afaik
Совершенно уверен, что вам нужно следовать документации создание шаблонов компонентов формы для настройки. Документы компонентов легко перепутать с документами фреймворка.