PUT请求不使用Symfony表单和FosRest

 起五贪黑_719 发布于 2023-02-09 19:59

我正在尝试使用FosRest和Symfony表单在Symfony中为用户管理编写一个简单的restful控制器.我的应用程序由Amazon DynamoDB支持,但我不认为这很重要.

我有DELETE,GET和POST(新用户)都完美无缺.

我现在来写PUT动作(编辑用户)似乎不起作用.我花了很多年头撞在砖墙上,我无法解决这个问题.

为了创建PUT,我基本上复制了POST操作,但是修改它以首先加载旧对象.

在POST中,User对象自动由$ form-> handleRequest($ request)行填充;

这似乎不适用于PUT操作,用户对象不会被填充/修改.我检查了$ _REQUEST数组,并且正在提交数据.由于缺乏对PUT的浏览器支持,我通过使用查询参数_method = PUT对数据进行POST来调用该操作(对DELETE工作正常,并且它正在路由到正确的位置).

这是我的POST动作有效:

public function postUsersAction(Request $request)
{

    $user = new User();
    $user->setTable($this->getTable());

    $formBuilder = $this->createFormBuilder($user, array(
        'validation_groups' => array('registration', '')))
        ->add('username', 'text')
        ->add('password', 'password')
        ->setAction($this->generateUrl('post_users'))
        ->setMethod('POST')
        ->setAttribute('validation_groups', array('registration'));
    $roles = $this->getFlattenedRoles($this->getRoles());

    $formBuilder->add('roles', 'choice', array(
        'choices'   => $roles,
        'multiple'  => true,
        'expanded'  => true
    ));

    $form = $formBuilder->add('save', 'submit')->getForm();

    $form->handleRequest($request);

    if ($form->isValid())
    {
        $user->save();
        $params = array('user' => $user);
        $view = $this->view($params, 200)
            ->setTemplate("MyRestBundle:User:newconfirm.html.twig");
        return $this->handleView($view);
    }

    $params = array('form' => $form, 'user' => $user);
    $view = $this->view($params, 400)
        ->setTemplate("MyRestBundle:User:new.html.twig");
    return $this->handleView($view);
}

这是我的PUT控制器没有:

public function putUserAction($slug, Request $request)
{
    $table = $this->getTable();
    $user = $table->load($slug);

    $formBuilder = $this->createFormBuilder($user)
        ->add('password', 'password')
        ->setAction($this->generateUrl('put_user', array('slug' => $slug, '_method' => 'PUT')))
        ->setMethod('POST');
    $roles = $this->getFlattenedRoles($this->getRoles());

    $formBuilder->add('roles', 'choice', array(
        'choices'   => $roles,
        'multiple'  => true,
        'expanded'  => true
    ));

    $form = $formBuilder->add('save', 'submit')->getForm();

    $form->handleRequest($request);

    if ($form->isValid())
    {
        $user->save();
        $params = array('user' => $user);
        $view = $this->view($params, 200)
            ->setTemplate("MyRestBundle:User:newconfirm.html.twig");
        return $this->handleView($view);
    }

    $params = array('form' => $form, 'user' => $user);
    $view = $this->view($params, 400)
        ->setTemplate("MyRestBundle:User:new.html.twig");
    return $this->handleView($view);
}

任何帮助将不胜感激.

1 个回答
  • 好的,在Symfony IRC频道的一些帮助之后,事实证明这不起作用的原因是这部分代码:

    $formBuilder = $this->createFormBuilder($user)
        ->add('password', 'password')
        ->setAction($this->generateUrl('put_user', array('slug' => $slug, '_method' => 'PUT')))
        ->setMethod('POST');
    

    由于PUT在许多浏览器中不起作用,我试图将方法设置为POST并将_method = PUT作为查询参数传递以覆盖真正的HTTP方法.事实证明没有必要这样做,Symfony将为您处理这一切.上面的代码现在只是:

    $formBuilder = $this->createFormBuilder($user)
        ->add('password', 'password')
        ->setAction($this->generateUrl('put_user', array('slug' => $slug))
        ->setMethod('PUT');
    

    通过这样做,Symfony实际上呈现了一个带有隐藏_method字段的POST表单 - 无需手动执行任何操作.

    2023-02-09 20:02 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有