修复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', ]);
});
编码愉快!
推荐阅读
- 如何从SQL Server Management Studio中的多个备份(bak)文件还原数据库
- 如何使用sfGuardPlugin在Symfony 1.4中手动登录用户
- 如何在不使用C语言的sqrt函数的情况下获得数字的平方根
- 如何在Symfony 4中注册自定义DQL函数(原则扩展)
- 如何建立有编码和无编码的电子学习网站()
- Android格式的日期为Datepicker的MM-DD-YYYY
- Android Studio(我还可以在清单中使用带有appcompat主题的HOLO Light DatePicker吗())
- 设计Facebook参数app_id是必需的
- 如何在android中进行菜单选择器