Forms Symfony2-使用事件订阅服务器时字段不存在

Forms Symfony2-使用事件订阅服务器时字段不存在,forms,events,symfony,Forms,Events,Symfony,我正在尝试实现可靠的表单,我遵循了它,但它似乎没有找到字段 视图: 注意:我没有使用示例中使用的“位置”模型,因为我不需要额外的字段或其他实体。(至少我认为我没有) 我使用的是2.3版 我试图做到的是:用户选择公司,用户字段应该只填充属于所选公司的用户 表格: 公司认购人: class AddCompanyFieldSubscriber implements EventSubscriberInterface { private $factory; public function

我正在尝试实现可靠的表单,我遵循了它,但它似乎没有找到字段

视图:

注意:我没有使用示例中使用的“位置”模型,因为我不需要额外的字段或其他实体。(至少我认为我没有)

我使用的是2.3版

我试图做到的是:用户选择公司,用户字段应该只填充属于所选公司的用户

表格:

公司认购人:

class AddCompanyFieldSubscriber implements EventSubscriberInterface
{
    private $factory;

    public function __construct(FormFactoryInterface $factory)
    {
        $this->factory = $factory;
    }

    public static function getSubscribedEvents()
    {
        return array(
            FormEvents::PRE_SET_DATA => 'preSetData',
            FormEvents::PRE_BIND     => 'preBind'
        );
    }

    private function addCompanyForm($form, $company)
    {
        $form->add('company', 'entity', array(
            'class'         => 'UserBundle:Company',
            'mapped'        => false,
            'data'          => $company,
            'empty_value'   => 'Company',
            'attr'          => array(
                'class' => 'company_selector',
            ),
            'query_builder' => function (EntityRepository $repository) {
                $qb = $repository->createQueryBuilder('company');

                return $qb;
            }
        ));
    }

    public function preSetData(FormEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();

        if (null === $data) {
            return;
        }

        $accessor = PropertyAccess::getPropertyAccessor();
        $user = $accessor->getValue($data, 'user');
        $company = ($data->getUser()) ? $data->getUser()->getCompany() : null ;
        $this->addCompanyForm($form, $company);
    }

    public function preBind(FormEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();

        if (null === $data) {
            return;
        }

        $company = array_key_exists('company', $data) ? $data['company'] : null;
        $this->addCompanyForm($form, $company);
    }
用户订户: 类AddUserFieldSubscriber实现EventSubscriberInterface { 私人工厂

    public function __construct(FormFactoryInterface $factory)
    {
        $this->factory = $factory;
    }

    public static function getSubscribedEvents()
    {
        return array(
            FormEvents::PRE_SET_DATA => 'preSetData',
            FormEvents::PRE_BIND     => 'preBind'
        );
    }

    private function addUserForm($form, $user, $company)
    {
        $form->add($this->factory->createNamed('user','entity', null, array(
            'class'         => 'UserBundle:User',
            'empty_value'   => 'Select User',
            'data'          => $user,
            'auto_initialize' => false,
            'attr'          => array(
            'class' => 'user_selector',
            ),
            'query_builder' => function (EntityRepository $repository) use ($company) {
                $qb = $repository->createQueryBuilder('user')
                    ->innerJoin('user.company', 'company');
                if ($company instanceof Company) {
                    $qb->where('user.company = :company')
                    ->setParameter('company', $company);
                } elseif (is_numeric($company)) {
                    $qb->where('company.id = :company')
                    ->setParameter('company', $company);
                } else {
                    $qb->where('company.name = :company')
                    ->setParameter('company', null);
                }

                return $qb;
            }
        )));
    }

    public function preSetData(FormEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();

        if (null === $data) {
            return;
        }
        $accessor = PropertyAccess::getPropertyAccessor();
        $user = $accessor->getValue($data, 'user');
        $company = ($data->getUser()) ? $data->getUser()->getCompany() : null ;
        $this->addUserForm($form, $user, $company);
    }

    public function preBind(FormEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();

        if (null === $data) {
            return;
        }

        $company = array_key_exists('company', $data) ? $data['company'] : null;
        $user = array_key_exists('user', $data) ? $data['user'] : null;
        $this->addUserForm($form, $user, $company);
    }
}

我在这里遗漏了什么?

只是一个想法,但是您是否尝试过在您的细枝模板中{{dump()}}查看有哪些变量可用

这只是一个很长的目标,但是在preBind()函数中,您正在检查$data中是否存在键“user”和“company”,因此我猜,在您的细枝模板中,您应该使用

{{ form_row(company) }} {# instead of {{ form_row(form.company) }} #}
{{ form_row(user) }} {# instead of {{ form_row(form.user) }} #}
class AddCompanyFieldSubscriber implements EventSubscriberInterface
{
    private $factory;

    public function __construct(FormFactoryInterface $factory)
    {
        $this->factory = $factory;
    }

    public static function getSubscribedEvents()
    {
        return array(
            FormEvents::PRE_SET_DATA => 'preSetData',
            FormEvents::PRE_BIND     => 'preBind'
        );
    }

    private function addCompanyForm($form, $company)
    {
        $form->add('company', 'entity', array(
            'class'         => 'UserBundle:Company',
            'mapped'        => false,
            'data'          => $company,
            'empty_value'   => 'Company',
            'attr'          => array(
                'class' => 'company_selector',
            ),
            'query_builder' => function (EntityRepository $repository) {
                $qb = $repository->createQueryBuilder('company');

                return $qb;
            }
        ));
    }

    public function preSetData(FormEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();

        if (null === $data) {
            return;
        }

        $accessor = PropertyAccess::getPropertyAccessor();
        $user = $accessor->getValue($data, 'user');
        $company = ($data->getUser()) ? $data->getUser()->getCompany() : null ;
        $this->addCompanyForm($form, $company);
    }

    public function preBind(FormEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();

        if (null === $data) {
            return;
        }

        $company = array_key_exists('company', $data) ? $data['company'] : null;
        $this->addCompanyForm($form, $company);
    }
    public function __construct(FormFactoryInterface $factory)
    {
        $this->factory = $factory;
    }

    public static function getSubscribedEvents()
    {
        return array(
            FormEvents::PRE_SET_DATA => 'preSetData',
            FormEvents::PRE_BIND     => 'preBind'
        );
    }

    private function addUserForm($form, $user, $company)
    {
        $form->add($this->factory->createNamed('user','entity', null, array(
            'class'         => 'UserBundle:User',
            'empty_value'   => 'Select User',
            'data'          => $user,
            'auto_initialize' => false,
            'attr'          => array(
            'class' => 'user_selector',
            ),
            'query_builder' => function (EntityRepository $repository) use ($company) {
                $qb = $repository->createQueryBuilder('user')
                    ->innerJoin('user.company', 'company');
                if ($company instanceof Company) {
                    $qb->where('user.company = :company')
                    ->setParameter('company', $company);
                } elseif (is_numeric($company)) {
                    $qb->where('company.id = :company')
                    ->setParameter('company', $company);
                } else {
                    $qb->where('company.name = :company')
                    ->setParameter('company', null);
                }

                return $qb;
            }
        )));
    }

    public function preSetData(FormEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();

        if (null === $data) {
            return;
        }
        $accessor = PropertyAccess::getPropertyAccessor();
        $user = $accessor->getValue($data, 'user');
        $company = ($data->getUser()) ? $data->getUser()->getCompany() : null ;
        $this->addUserForm($form, $user, $company);
    }

    public function preBind(FormEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();

        if (null === $data) {
            return;
        }

        $company = array_key_exists('company', $data) ? $data['company'] : null;
        $user = array_key_exists('user', $data) ? $data['user'] : null;
        $this->addUserForm($form, $user, $company);
    }
}
{{ form_row(company) }} {# instead of {{ form_row(form.company) }} #}
{{ form_row(user) }} {# instead of {{ form_row(form.user) }} #}