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 частей - там есть все, что вам нужно:
- http://welcometothebundle.com/symfony2-rest-api-the-best-2013-way/
- http://welcometothebundle.com/web-api-rest-with-symfony2-the-best-way-the-post-method/
- http://welcometothebundle.com/symfony2-rest-api-the-best-way-part-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
Посмотрите на этот код:
Также проверьте файлы validation.yml и сущности сериализатора yml.
Вам не нужны формы для проверки. И вам определенно не следует помещать логику создания и проверки пользователя в контроллер. В случае, если вы хотите использовать эту форму в любом случае позже, например. рендеринг на стороне сервера, вам придется писать один и тот же код дважды.