【问题标题】:Lexik Filter-: Argument 1 passed to Symfony\Component\Form\FormRenderer::searchAndRenderBlock()Lexik Filter-: 参数 1 传递给 Symfony\Component\Form\FormRenderer::searchAndRenderBlock()
【发布时间】:2016-02-16 10:43:52
【问题描述】:

我是 Symfony2 的新手,正在尝试使用 Lexik 过滤器包;我有 2 个实体(Parents-Training)以如下定义的 n-m(多对多)关系链接,我正在尝试按名称过滤父母列表:`tuto\LexikTestBundle\Entity\Parents:

type: entity
table: Parents
repositoryClass: tuto\LexikTestBundle\Repository\ParentRepository
id:
    id:
        type: integer
        generator:
            strategy: AUTO
fields:
    Firstname:
        type: string
        length: 50
    Lastname:
        type: string
        length: 50
    DOB:
        type: datetime
    Email:
        type: string
        length: 50
manyToMany:
    Trainings:
        targetEntity: Training
        mappedBy: parents`  

我正在学习使用 3.0.8 版的教程并定义了以下自定义过滤器类型:

namespace tuto\LexikTestBundle\Form\Filter;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;


class MyParentsType extends AbstractType
{
    /**
     * Returns the name of this type.
     *
     * @return string The name of this type
     */
    public function getName()
    {
        return 'parents_filter';
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('Firstname', 'filter_text');
        $builder->add('Lastname', 'filter_text');

    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(
            [
                'csrf_protection' => false,
                'validation_groups' => ['filtering'] // avoid NotBlank() constraint-related message
            ]
        );
    }
}

以及控制器中的以下FilterAction:

public function indexAction(Request $request)
{


    $em = $this->getDoctrine()->getManager();
    $entities = $em->getRepository('tutoLexikTestBundle:Parents')->findAll();

    $form = $this->testFilterAction($request);

    return $this->render('tutoLexikTestBundle:Parents:index.html.twig', [
        'entities' => $entities,
        'form' => $form,
    ]
    );
}

public function testFilterAction(Request $request)
{
    $form= $this->get('form.factory')->create(new MyParentsType());

    if($request->query->has($form->getName())) {
        // manually bind values from the request
        $form->submit($request->query->get($form->getName()));

        $queryBuilder = $this->get('doctrine.orm.entity_manager')
            ->getRepository('LexikTestBundle:Parents')
            ->createQueryBuilder('e');

        //build the query from the given object
        $this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($form,$queryBuilder);
        var_dump($queryBuilder->getDql());
    }

    return $this->render(
        'tutoLexikTestBundle:Default:testFilter.html.twig',
        ['form'=>$form->createView()]
    );
}

实现的树枝是

<form method="get" action=".">
  {{ form_rest(form) }}
  <input type="submit" name="submit-filter" value="filter" />
</form>

我已经通过以下答案,似乎没有同样的错误:

但我仍然面临 可捕获的致命错误:传递给 Symfony\Component\Form\FormRenderer::searchAndRenderBlock() 的参数 1 必须是 Symfony\Component\Form\FormView 的实例,Symfony\ 的实例Component\HttpFoundation\Response 给出任何提示都会受到欢迎。

【问题讨论】:

    标签: php forms symfony doctrine-orm


    【解决方案1】:

    你应该渲染一个表单视图而不是一个表单对象:

    public function indexAction(Request $request)
    {
        $em = $this->getDoctrine()->getManager();
        $entities = $em->getRepository('tutoLexikTestBundle:Parents')->findAll();
    
        $form = $this->testFilterAction($request);
    
        return $this->render('tutoLexikTestBundle:Parents:index.html.twig', [
            'entities' => $entities,
            'form' => $form->createView(),
        ]);
    }
    

    您的 testFilterAction 返回一个 Response 对象而不是表单对象或视图,请更改您的方法如下:

    注意:您可以在 tutoLexikTestBundle:Parents:index.html.twig 视图中嵌套表单模板

    public function testFilterAction(Request $request)
    {
        $form = $this->get('form.factory')->create(new MyParentsType());
    
        if ($request->query->has($form->getName())) {
            // manually bind values from the request
            $form->submit($request->query->get($form->getName()));
    
            $queryBuilder = $this->get('doctrine.orm.entity_manager')
                ->getRepository('LexikTestBundle:Parents')
                ->createQueryBuilder('e');
    
            // build the query from the given object
            $this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($form,$queryBuilder);
            var_dump($queryBuilder->getDql());
        }
    
        return $form; // return form object
    }
    

    【讨论】:

    • 我确实试过了,但得到了一个'Call to undefined method Symfony\Component\HttpFoundation\Response::createView()'
    • 是的,这是预期的行为,请按上述方式编辑您的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 2021-09-27
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    相关资源
    最近更新 更多