我有这个简单的控制器:
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 %}
我收到了这个错误:
在渲染模板期间抛出异常(“Catchable Fatal Error:类My \ ApplicationBundle \ Entity \ Search的对象无法转换为字符串
BTW,只是HTML的渲染效果很好。
任何想法?谢谢你的帮助
已解决:我找到了一种解决方法,用于更改表单的呈现方式:
{{ form_start(form, {'attr': {'class': 'form-search'}}) }}
{{ form_widget(form.query, {'attr': {'class': 'form-control search-query'}}) }}
{{ form_end(form) }}
答案 0 :(得分:1)
我想我找到了你的问题here的答案。
从
AbstractType
继承的方法将创建名称 到将导致search
的班级名称。但这会导致 渲染时出现问题,因为有一个块来呈现类型search
但对于核心类型。您应该使用a显式设置名称 名称尚未使用(一个好方法是用它的别名作为前缀 束)
所以问题可能在名称search
本身。然后尝试指定不同的名称。
答案 1 :(得分:0)
每个表单都需要知道保存基础数据的类的名称,如here所述
您应该将以下方法添加到SearchType
类:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'MyApplicationBundle\Entity\Search',
));
}
并记得添加以下use
方法:
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
希望这个帮助