修复Twig_Error_Runtime无法在Silex中加载”Symfony\Component\Form\FormRenderer”运行时

随着Symfony 4的引入, 许多组件都进行了更新, 因此向后兼容性也下降了。但是, Symfony与Silex有什么关系?是的, silex基本上与symfony组件一起工作, 例如在Forms的情况下。使用silex, 使用FormServiceProvider, 你将能够在silex应用程序中创建表单, 从而集成了针对csrf攻击的保护。
【修复Twig_Error_Runtime无法在Silex中加载” Symfony\Component\Form\FormRenderer” 运行时】当你使用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 filereturn $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 Bridge和Symfony的Form组件, 则Twig会引发异常。但是, 解决方案非常简单, 你应该使用symfony的Form Renderer来提供Symfony的Form Renderer来防止异常, 而不是使用以下代码:
use Symfony\Component\Form\FormRenderer; $app-> extend('twig.runtimes', function ($runtimes, $app) {return array_merge($runtimes, [FormRenderer::class => 'twig.form.renderer', ]); });

上一小段代码仅指示应使用Symfony的Form renderer类来呈现表单。
完整的例子如果你仍然不了解解决方案代码的位置, 那么使用完整的示例将更容易实现。例如, 使用Silex的默认框架, 你将拥有一个app.php文件, 所有服务提供商均已加载到此处, 你可以在此处替换表单渲染器:
< ?php // src/app.php or the file where you store the configuration of the silex project// This namespace is to load the Form provideruse Silex\Provider\FormServiceProvider; // Import the form renderer of Symfony used to solve the mentioned issueuse Symfony\Component\Form\FormRenderer; // Usually you should have at least the following configuration in your project// to be able to work with symfony forms$app-> 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', ]); });

编码愉快!

    推荐阅读