Aprenda a resolver la excepción Unable to load the "Symfony\Component\Form\FormRenderer" runtime en Silex al usar Symfony Forms.

Arreglar Twig_Error_Runtime Unable to load the "Symfony\Component\Form\FormRenderer" runtime en Silex

Con la introducción de Symfony 4, se actualizaron muchos componentes y, por lo tanto, también se eliminó la compatibilidad con versiones anteriores. Pero, ¿qué tiene que ver Symfony con Silex? Sí, bueno, silex funciona básicamente con componentes de Symfony, como en el caso de los formularios. Con silex, utilizando FormServiceProvider podrás crear formularios en tu aplicación silex integrando protección contra ataques csrf.

La excepción que ve cuando implementa un formulario muy simple usando silex y Twig Bridge (para poder representar el formulario en una vista) es causada por una desaprobación en el módulo TwigRenderer, por ejemplo, dado el siguiente controlador:

// Registrar la ruta índice
$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();
     
    // Utiliza el motor de plantillas Twig para renderizar el archivo PHP
    return $app['twig']->render('index.html.twig', array(
        "form" => $form->createView()
    ));
})->bind('homepage');

Y en este caso nuestro archivo index.html.twig tendrá el siguiente contenido:

{# index.html.twig #}
{% extends "layout.html.twig" %}

{% block content %}
    {{ form_start(form) }}
    
    {{ form_end(form)}}
{% endblock %}

Twig lanzaría la excepción si está utilizando la última versión de Twig Bridge y el componente Form de Symfony. Sin embargo, la solución es bastante simple, en lugar de usar Twig Renderer, debes proporcionar el Form Renderer de Symfony para evitar la excepción con el siguiente código:

use Symfony\Component\Form\FormRenderer;

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

El fragmento anterior simplemente indica que la clase de renderizador de formularios de Symfony debería usarse para renderizar el formulario.

Ejemplo completo

Si aún no entiendes dónde colocar el código de la solución, con un ejemplo completo te será más fácil hacerlo. Por ejemplo, usando el esqueleto predeterminado de Silex, tendrá un archivo app.php donde se cargan todos los proveedores de servicios, aquí podría reemplazar el renderizador de formularios:

<?php 
// src/app.php o el archivo donde guardas la configuración del proyecto silex

// Este espacio de nombres es para cargar el proveedor de formularios.
use Silex\Provider\FormServiceProvider;

// Importe el renderizador de formularios de Symfony utilizado para resolver el problema mencionado
use Symfony\Component\Form\FormRenderer;
 
// Por lo general, debe tener al menos la siguiente configuración en su proyecto
// para poder trabajar con formularios Symfony
$app->register(new FormServiceProvider());
$app->register(new Silex\Provider\TranslationServiceProvider(), array(
    'translator.domains' => array(),
));
$app["locale"] = "en";


// Y la razón por la que estás leyendo este artículo:
//
// Importante: para corregir el error, reemplace el TwigRenderer obsoleto de la versión 3.4 de Symfony
// con el Renderizador de formularios de Symfony en su lugar
$app->extend('twig.runtimes', function ($runtimes, $app) {
    return array_merge($runtimes, [
        FormRenderer::class => 'twig.form.renderer',
    ]);
});

Que te diviertas ❤️!


Ingeniero de Software Senior en EPAM Anywhere. Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores