个性化阅读
专注于IT技术分析

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

随着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', ]);
});

编码愉快!

赞(0)
未经允许不得转载:srcmini » 修复Twig_Error_Runtime无法在Silex中加载”Symfony\Component\Form\FormRenderer”运行时

评论 抢沙发

评论前必须登录!