symfony2:呈现模板时出错-对象无法转换为字符串


symfony2: error when rendering template - Object could not be converted to string

我有一个简单的控制器:

class SearchController extends Controller{
public function indexAction(Request $request)
{
    $search = new Search();
    $form = $this->createForm(new SearchType(), $search);
    $form->handleRequest($request);
    if ($form->isValid()) {
        return $this->redirect($this->generateUrl('search'));
    }
    return $this->render('MyApplicationBundle:Search:index.html.twig', array(
        'form' => $form->createView(),
    ));
}
}

这就是搜索实体:

class Search {
protected $query;
public function setQuery($query)
{
    $this->query = $query;
}
public function getQuery()
{
    return $this->query;
}
}

这是我的表格:

class SearchType extends AbstractType{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('query', 'text')
        ->add('search', 'submit');
}
public function getName()
{
    return 'search';
}
}

不幸的是,当试图呈现表单时

{% extends '::base.html.twig' %}
{% block body %}
{{ form(form) }}
{% endblock %}

我得到了这个错误:

呈现模板期间引发异常("可捕获的致命错误:类My''ApplicationBundle''Entity''Search的对象无法在中转换为字符串

顺便说一句,仅仅HTML的呈现效果很好。

知道吗?谢谢你的帮助

解决:我找到了一个改变如何呈现表单的变通方法:

    {{ form_start(form, {'attr': {'class': 'form-search'}}) }}
{{ form_widget(form.query, {'attr': {'class': 'form-control search-query'}}) }}
{{ form_end(form) }}

我想我在这里找到了你问题的答案。

AbstractType继承的方法将根据到将导致CCD_ 2的类名。但这会导致渲染时出现问题,因为存在要渲染类型search的块但是对于核心类型。您应该使用名称尚未使用(一个好方法是在其前面加上束)

因此,问题可能在名称search本身。然后尝试指定其他名称。

每个表单都需要知道保存底层数据的类的名称,如所述

您应该将以下方法添加到SearchType类中:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'MyApplicationBundle'Entity'Search',
    ));
}

并记得添加以下use方法:

use Symfony'Component'OptionsResolver'OptionsResolverInterface;

希望这能帮助