Symfony FOSRestBundle如何验证注册?

Symfony FOSRestBundle如何验证注册?,symfony,fosuserbundle,fosrestbundle,Symfony,Fosuserbundle,Fosrestbundle,我正在使用FOSUserBundle和FOSRestBundle在Symfony 2.3.*中开发一个RESTFul API,我很难理解如何创建注册方法 我的控制器如下所示: class UserRestController extends FOSRestController { //Other Methods ... public function postUserAction() { $userManager = $this->get('fos

我正在使用FOSUserBundle和FOSRestBundle在Symfony 2.3.*中开发一个RESTFul API,我很难理解如何创建注册方法

我的控制器如下所示:

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';
    }
}
当我测试它时,不管表单是无效的还是没有显示错误的。 当我尝试获取请求时:

验证失败“”此表单不应包含额外字段

是否有方法正确验证表单


编辑:更新我的问题。

我建议您将本教程分为三个部分,其中包括您需要的所有内容:

如果要提供复杂的用户验证,应创建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);
}
在本教程的第2部分中,您了解了有关创建表单、传递数据以及使用RestBundle验证表单的所有信息


还有很多关于使用REST与Symfony2的最佳实践的信息。

请查看以下代码:

还要检查validation.yml和实体序列化程序yml文件

您不需要表单来进行验证。而且您不应该将用户创建和验证逻辑放在控制器中。如果您以后仍想使用该表单,例如,在后端渲染它,则必须编写两次相同的代码。

我必须让getName()方法返回“”,才能使其对我起作用


看一看,我对symfony很陌生,我不理解答案的大部分代码。就像调度员的角色。这个答案似乎不适合我要找的。如果你遇到任何问题,请告诉我。事实上我是这样做的。我用FOSRest完成了我的UserClass并创建了一个UserType.php。我不明白为什么当我用正确的信息测试post路由时它不会验证,因为当我得到错误时,它告诉我没有错误。还有一件事:请粘贴实体类,因为您使用的是忘记导入的注释。你如何测试它?单元测试?我正在用Postman RestClient测试它,问题是我没有使用@Enum注释,即使我导入它,错误也是一样的。对于REST来说,这被认为是一种不好的做法。我想用表单验证,我知道这是可能的,但我无法验证表单。我不知道怎么做。如果您需要使用表单进行验证,这可能会帮助您:。查看第一个提示,它说:“当将表单映射到对象时,所有字段都被映射。表单上任何不存在于映射对象上的字段都将引发异常。”。确保所有字段都正确映射到您的实体(例如密码重新设置字段)。