Symfony3 - 表单事件订阅者无法正常工作

时间:2017-05-09 10:05:21

标签: php symfony symfony-forms

我有一个名为ProfileType的表单,当我提交此表单时,我想要处理一些表格事件订阅者我认为应该完成这项工作所以我去实现了但是当我提交表单时事件是没有被解雇,我在“未调用事件”选项卡下的分析器中看到事件

所以这就是我所做的,我不确定我在这里缺少什么。 这是我的ProfileType课程,你会发现我有->addEventSubscriber(new SkillsListener())

namespace AppBundle\Form;

use AppBundle\EventListener\SkillsListener;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ProfileType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('street')
            ->add('city')
            ->add('state')
            ->addEventSubscriber(new SkillsListener())
        ;
    }


    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\User',
            'validation_groups' => 'profile'
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'appbundle_user';
    }


}

然后我创建了我的列表器

namespace AppBundle\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;

class SkillsListener implements EventSubscriberInterface
{

    public static function getSubscribedEvents()
    {
        return array(
            FormEvents::PRE_SUBMIT      => 'onPreSubmit',
            FormEvents::PRE_SET_DATA    => 'onPreSetData',
        );
    }


    public function onPreSetData(FormEvent $event)
    {

        $user = $event->getData();
        $form = $event->getForm();
        dump($user, $form);
        die;

    }

    public function onPreSubmit(FormEvent $event)
    {
        $user = $event->getData();
        $form = $event->getForm();
        dump($user, $form);
        die;
    }
}

我做了dump()die只是为了调试我得到的东西,所以我可以实现我需要的过程,但事件不会触发。

我想我可能需要在services.yml中添加一些内容,但这无济于事

app.form_event_listener.skills_listener:
    class: AppBundle\EventListener\SkillsListener
    tags:
        - { name: kernel.event_subscriber }

我没有得到任何错误,只是事件没有触发。我在这里失踪了什么?任何帮助将不胜感激。

更新1 这是与表单

链接的控制器
/**
 * @Route("/profile/edit", name="internee_profile_edit")
 * @param Request $request
 *
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function editProfileAction( Request $request ) {
    $em = $this->getDoctrine()->getManager();
    /** @var User $user */
    $user             = $this->getUser();
    $profileForm      = $this->createForm( ProfileType::class, $user );
    $profileForm->handleRequest( $request );
    if ( $profileForm->isValid() ) {
        $em->persist( $user );
        $em->flush();
        $this->addFlash( 'success', $this->get( 'translator' )->trans( 'user.profile.success.saved' ) );
    }
    return $this->render( 'AppBundle:jobseeker:profile-edit.html.twig', array( 'form' => $profileForm->createView() ) );
}

更新2

我已更新我的ProfileType以使用侦听器,但这也无效。

public function buildForm( FormBuilderInterface $builder, array $options ) {
    $builder
        ->add( 'name' )
        ->add( 'street' )
        ->add( 'city' )
        ->add( 'state' )
    ;
    $builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        array( $this, 'onPreSetData' )
    );

}

public function onPreSetData(FormEvent $event)
{
    dump($event);
}

0 个答案:

没有答案