Исключение при рендеринге формы для вставки нового объекта [symfony2]

#symfony #doctrine-orm

#symfony #doctrine-orm

Вопрос:

У меня проблема с отображением представления для создания нового объекта, и я не могу найти здесь ответа на существующую проблему, поэтому я собираюсь спросить… В моем приложении есть объект X, который принадлежит одному объекту Y и может иметь много объектов Z.

Когда консоль запускается, она хорошо работает со всеми этими отношениями.

php appconsole doctrine:schema:update --force,

После генерации crud для объекта X страница со списком отображается нормально, но страница для создания новой записи выдает следующее исключение:

Во время рендеринга шаблона возникло исключение («Предупреждение: call_user_func_array () ожидает, что параметр 1 будет допустимым обратным вызовом, класс ‘Symfony Bridge Twig Extension FormExtension’ не имеет метода ‘renderer-> humanize’ в %path_to_app%appcachedevtwig1616033db1d32d7d10db7a0d24db2f49938a4b2e9a63d231d90bf70d1969563fd0.php строка 880») в form_div_layout.html.веточка в строке 232.

В чем может быть проблема?

Обновление 1:

Триггер исключения находится в файле twig, куда передаются данные от контроллера. В {{ form_widget(form) }}

Обновление 2:

// метод контроллера

 /**
 * 
 *
 * @Route("/new", name="class_new")
 * @Template()
 */
public function newAction()
{
    $entity = new Class();
    $form   = $this->createForm(new ClassType(), $entity);

    return array(
        'entity' => $entity,
        'form'   => $form->createView(),
    );
}
  

//Класс формы

 class ClassType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AdminMainBundleEntityClass'
        ));
    }

    public function getName()
    {
        return 'admin_mainbundle_classtype';
    }
}
  

// просмотр

 <form action="{{ path('class_create') }}" method="post" {{ form_enctype(form) }}>
    {{ form_widget(form) }}
    <p>
        <button type="submit">Create</button>
    </p>
</form>
  

Ответ №1:

Попробуйте очистить кеш: php bin/console cache:clear и повторно запустите свою команду.

Если проблема сохраняется: посмотрите в вашем контроллере, используется ли неопределенная функция для примера renderer->humanize и посмотрите layout.html.twig at line 232.

Комментарии:

1. Проблема сохраняется, несмотря на очистку кэша, которую я уже выполнял.

2. Этот макет взят из зависимостей. Контроллеры и другие вещи автоматически генерируются php app console doctrine:generate:crud. Я не могу изменить код из каталога поставщика.

Ответ №2:

Я не вижу никаких проблем в вашем контроллере и представлении.

Итак, я попытался найти в form_div_layout.html.twig файле и обнаружил, что там используется функция humanize, а исключение говорит, что функция не определена.

Итак, вы можете обновить свой проект, : composer install

form_div_layout.html.twig :

 {%- block form_label -%}
    {% if label is not same as(false) -%}
        {% if not compound -%}
            {% set label_attr = label_attr|merge({'for': id}) %}
        {%- endif -%}
        {% if required -%}
            {% set label_attr = label_attr|merge({'class': (label_attr.class|default('') ~ ' required')|trim}) %}
        {%- endif -%}
        {% if label is empty -%}
            {%- if label_format is not empty -%}
                {% set label = label_format|replace({
                    '%name%': name,
                    '%id%': id,
                }) %}
            {%- else -%}
                {% set label = name|humanize %}
            {%- endif -%}
        {%- endif -%}
        <label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>{{ translation_domain is same as(false) ? label : label|trans({}, translation_domain) }}</label>
    {%- endif -%}
{%- endblock form_label -%}

{%- block button_label -%}{%- endblock -%}
  

Ответ №3:

Я решил это несколько недель назад, но теперь я нашел время для ответа. Это вызывало у меня головную боль перед переносом версии приложения с 2.1 на 2.8. В настоящее время это работает хорошо.