我有一个简单的控制器:
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;
希望这能帮助