随着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 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 provider
use Silex\Provider\FormServiceProvider;
// Import the form renderer of Symfony used to solve the mentioned issue
use 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', ]);
});
编码愉快!
评论前必须登录!
注册