FOSRestBundle Как подтвердить регистрацию?

Я разрабатываю RESTFul API в Symfony 2.3.* С FOSUserBundle и FOSRestBundle, и у меня возникают проблемы с пониманием того, как создать метод регистрации.

Мой контроллер выглядит так:

class UserRestController extends FOSRestController
{
    //Other Methods ...

    public function postUserAction()
    {
        $userManager = $this->get('fos_user.user_manager');
        $user = $userManager->createUser();

        $param = $paramFetcher->all();
        $form = $this->createForm(new UserType(), $user);
        $form->bind($param);

        if ($form->isValid() == false)
            return $this->view($form, 400);

        $userManager->updateUser($user);
        return $this->view('User Created', 201);
    }

    //...
}

И мой класс UserType:

class UserType extends BaseType
{
    public function __construct($class = "User")
    {
        parent::__construct($class);
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('username', 'username')
                ->add('email', 'email')
                ->add('plainPassword', 'repeated', array(
                   'first_name' => 'password',
                   'second_name' => 'confirm',
                   'type' => 'password'
                ))
                ->add('lastname')
                ->add('firstname')
                ->add('job_position')
                ->add('phone')
                ->add('company_name')
                ->add('website')
                ->add('sector')
                ->add('address')
                ->add('city')
                ->add('zip_code')
                ->add('country')
                ->add('billing_infos_same_as_company')
                ->add('billing_address')
                ->add('billing_city')
                ->add('billing_zip')
                ->add('billing_country')
                ->add('putf')
                ->add('das');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Wipsea\UserBundle\Entity\User',
            'csrf_protection' => false
        ));
    }

    public function getName()
    {
        return 'wipsea_user_registration';
    }
}

Когда я проверяю его, независимо от того, какая форма недействительна и не показывает ошибок. И когда я пытаюсь получить запрос:

"Ошибка проверки" "Эта форма не должна содержать дополнительных полей".

Есть ли способ правильно проверить форму?

РЕДАКТИРОВАТЬ: Обновление моей проблемы.

3 ответа

Решение

Я бы порекомендовал вам этот урок из 3 частей - там есть все, что вам нужно:

Если вы хотите обеспечить сложную проверку пользователя, вы должны создать форму UserType и передать данные в эту форму вместо прямой установки всех свойств:

public function postAction()
{
    $user = new User();

    $form = $this->createForm(new UserType(), $user);
    $form->handleRequest($this->getRequest());

    if ($form->isValid()) {
        // propel version
        $user->save();

        $response = new Response();
        $response->setStatusCode(201);

        // set the `Location` header only when creating new resources
        $response->headers->set('Location',
            $this->generateUrl(
                'acme_demo_user_get', array('id' => $user->getId()),
                true // absolute
            )
        );

        return $response;
    }

    // return form validation errors
    return View::create($form, 400);
}

Во второй части этого учебного пособия у вас есть вся информация о создании формы, передаче данных и проверке ее с помощью RestBundle.

Существует также много информации о лучших практиках использования REST с Symfony2.

Мне нужно было вернуть метод getName(), чтобы он работал для меня.

https://github.com/FriendsOfSymfony/FOSRestBundle/issues/585

Посмотрите на этот код:

https://github.com/piotrjura/fitness-api/blob/master/src/Fitness/FitnessBundle/Service/UsersService.php

https://github.com/piotrjura/fitness-api/blob/master/src/Fitness/FitnessBundle/Controller/UsersController.php

Также проверьте файлы validation.yml и сущности сериализатора yml.

Вам не нужны формы для проверки. И вам определенно не следует помещать логику создания и проверки пользователя в контроллер. В случае, если вы хотите использовать эту форму в любом случае позже, например. рендеринг на стороне сервера, вам придется писать один и тот же код дважды.

Другие вопросы по тегам