Исправить Twig_Error_Runtime Невозможно загрузить среду выполнения Symfony \ Component \ Form \ FormRenderer в Silex

С появлением Symfony 4 многие компоненты были обновлены, и поэтому была также удалена обратная совместимость. Но какое отношение Symfony имеет к Silex? Да, хорошо, Silex работает в основном с компонентами Symfony, как в случае с Forms. С Silex, используя FormServiceProvider, вы сможете создавать формы в своем приложении Silex, интегрируя защиту от CSRF-атак.

Исключение, которое вы видите, когда вы реализуете очень простую форму с использованием Silex и Twig Bridge (чтобы иметь возможность визуализировать форму в виде), вызвано устареванием в модуле TwigRenderer, например, с учетом следующего контроллера:

// Register the index route
$app->get('/', function () use ($app) {
// Create a form using the form factory
$form = $app['form.factory']->createBuilder(FormType::class, array())
->add('name')
->add('email')
->add('billing_plan', ChoiceType::class, array(
'choices' => array(
'free' => 1,
'small business' => 2,
'corporate' => 3
),
'expanded' => true,
))
->add('submit', SubmitType::class, [
'label' => 'Save',
])
->getForm();
// Use the Twig templating engine to render the PHP file
return $app['twig']->render('index.html.twig', array(
"form" => $form->createView()
));
})->bind('homepage');

И в этом случае наши index.html.twig Файл будет иметь следующее содержимое:

{# index.html.twig #}
{% extends "layout.html.twig" %}
{% block content %}
{{ form_start(form) }}
{{ form_end(form)}}
{% endblock %}

Twig выдаст исключение, если вы используете последнюю версию Twig Bridge и компонент Form Symfony. Решение, однако, довольно простое, вместо использования Twig Renderer, вы должны предоставить Form Renderer из symfony, чтобы исключить исключение с помощью следующего кода:

use Symfony\Component\Form\FormRenderer;
$app->extend('twig.runtimes', function ($runtimes, $app) {
return array_merge($runtimes, [
FormRenderer::class => 'twig.form.renderer',
]);
});

Предыдущий фрагмент просто указывает, что для визуализации формы следует использовать класс рендерера форм Symfony.

Полный пример

Если вы до сих пор не понимаете, где разместить код решения, с полным примером это будет проще сделать. Например, используя скелет Silex по умолчанию, у вас будет файл app.php, в который загружены все поставщики услуг, здесь вы можете заменить средство визуализации формы:

register(new FormServiceProvider());
$app->register(new Silex\Provider\TranslationServiceProvider(), array(
'translator.domains' => array(),
));
$app["locale"] = "en";
// And the reason why you are reading this article:
//
// Important: to fix the error, replace the TwigRenderer deprecated from the version 3.4 of symfony
// with the Form Renderer of symfony instead
$app->extend('twig.runtimes', function ($runtimes, $app) {
return array_merge($runtimes, [
FormRenderer::class => 'twig.form.renderer',
]);
});
Ссылка на основную публикацию
Adblock
detector