Ade*_*lal 6 php symfony fosuserbundle fosrestbundle symfony-2.7
问题已解决,请检查我的答案.
我正在我的Symfony2.7 rest api上建立一个注册端点.我正在使用FosRestBundle和FosUserBundle
这是用户模型:
<?php
namespace AppBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="fos_user")
*/
class User extends BaseUser {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
public function __construct() {
parent::__construct();
// your own logic
}
}
Run Code Online (Sandbox Code Playgroud)
\ 这是UserType表单: \
class UserType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('email', 'email')
->add('username', null)
->add('plainPassword', 'repeated', array(
'type' => 'password',
'first_options' => array('label' => 'password'),
'second_options' => array('label' => 'password_confirmation'),
))
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\User',
'csrf_protection' => false,
));
}
/**
* @return string
*/
public function getName()
{
return 'user';
}
}
Run Code Online (Sandbox Code Playgroud)
而这个帖子用户控制器:
public function postUserAction(\Symfony\Component\HttpFoundation\Request $request) {
$user = new \AppBundle\Entity\User();
$form = $this->createForm(new \AppBundle\Form\UserType(), $user);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
$view = $this->view(array('token'=>$this->get("lexik_jwt_authentication.jwt_manager")->create($user)), Codes::HTTP_CREATED);
return $this->handleView($view);
}
return array(
'form' => $form,
);
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我提交错误的信息或空信息时,服务器返回一个错误的格式化500错误,其中带有错误格式化条目列表的json响应状态中非空行的空值的doctrine/mysql详细信息.
有关如何解决此问题的任何想法?为什么验证得到通过和
Ade*_*lal 14
好好花了很多时间阅读FOSUserBundle代码,特别是注册控制器和表格工厂,我想出了一个完全可行的解决方案.
在做任何事情之前,不要忘记在symfony2配置中禁用CSRF.
这是我用来注册的控制器:
public function postUserAction(\Symfony\Component\HttpFoundation\Request $request) {
/** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */
$formFactory = $this->get('fos_user.registration.form.factory');
/** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
$userManager = $this->get('fos_user.user_manager');
/** @var $dispatcher \Symfony\Component\EventDispatcher\EventDispatcherInterface */
$dispatcher = $this->get('event_dispatcher');
$user = $userManager->createUser();
$user->setEnabled(true);
$event = new \FOS\UserBundle\Event\GetResponseUserEvent($user, $request);
$dispatcher->dispatch(\FOS\UserBundle\FOSUserEvents::REGISTRATION_INITIALIZE, $event);
if (null !== $event->getResponse()) {
return $event->getResponse();
}
$form = $formFactory->createForm();
$form->setData($user);
$form->handleRequest($request);
if ($form->isValid()) {
$event = new \FOS\UserBundle\Event\FormEvent($form, $request);
$dispatcher->dispatch(\FOS\UserBundle\FOSUserEvents::REGISTRATION_SUCCESS, $event);
$userManager->updateUser($user);
if (null === $response = $event->getResponse()) {
$url = $this->generateUrl('fos_user_registration_confirmed');
$response = new \Symfony\Component\HttpFoundation\RedirectResponse($url);
}
$dispatcher->dispatch(\FOS\UserBundle\FOSUserEvents::REGISTRATION_COMPLETED, new \FOS\UserBundle\Event\FilterUserResponseEvent($user, $request, $response));
$view = $this->view(array('token' => $this->get("lexik_jwt_authentication.jwt_manager")->create($user)), Codes::HTTP_CREATED);
return $this->handleView($view);
}
$view = $this->view($form, Codes::HTTP_BAD_REQUEST);
return $this->handleView($view);
}
Run Code Online (Sandbox Code Playgroud)
现在棘手的部分是使用REST提交表单.问题是,当我发送像这样的JSON时:
{
"email":"xxxxx@xxxx.com",
"username":"xxx",
"plainPassword":{
"first":"xxx",
"second":"xxx"
}
}
Run Code Online (Sandbox Code Playgroud)
API没有提交任何内容就响应了.
解决方案是Symfony2正在等待您将表单数据封装在表单名称中!
问题是"我没有创建这种形式所以我不知道它的名字是什么......".所以我再次使用捆绑代码,发现表单类型为fos_user_registration,getName函数返回fos_user_registration_form.
结果我尝试以这种方式提交我的JSON:
{"fos_user_registration_form":{
"email":"xxxxxx@xxxxxxx.com",
"username":"xxxxxx",
"plainPassword":{
"first":"xxxxx",
"second":"xxxxx"
}
}}
Run Code Online (Sandbox Code Playgroud)
瞧!有效.如果你正在努力设置你的fosuserbundle与fosrestbundle和LexikJWTAuthenticationBundle只是问我,我会很乐意提供帮助.
| 归档时间: |
|
| 查看次数: |
7350 次 |
| 最近记录: |