Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php FosRestBundele看跌期权方法不适用';不要使用表单,但要完美地发布或获取作品_Php_Rest_Symfony_Fosrestbundle - Fatal编程技术网

Php FosRestBundele看跌期权方法不适用';不要使用表单,但要完美地发布或获取作品

Php FosRestBundele看跌期权方法不适用';不要使用表单,但要完美地发布或获取作品,php,rest,symfony,fosrestbundle,Php,Rest,Symfony,Fosrestbundle,我正试图用Symfony2和FosRestBundle构建一个简单的Restful服务 如果我使用GET或POST方法发送请求,则响应将按预期进行 如果使用PUT或PATCH方法,结果为空 FormType namespace MobileService\UserBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Co

我正试图用Symfony2和FosRestBundle构建一个简单的Restful服务

如果我使用
GET
POST
方法发送请求,则响应将按预期进行

如果使用
PUT
PATCH
方法,结果为空

FormType
namespace MobileService\UserBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class CurrentLocationType extends AbstractType
{
/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('latitude')
        ->add('longitude')
        ->add('city')
        ->add('zip')
    ;
}

/**
 * @param OptionsResolverInterface $resolver
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'MobileService\UserBundle\Entity\CurrentLocation',
        'csrf_protection' => false
    ));
}

/**
 * @return string
 */
public function getName()
{
    return '';
}
}
我的控制器的
putAction($id)
postAction($id)
完全相同

控制器/动作

namespace MobileService\UserBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class CurrentLocationType extends AbstractType
{
/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('latitude')
        ->add('longitude')
        ->add('city')
        ->add('zip')
    ;
}

/**
 * @param OptionsResolverInterface $resolver
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'MobileService\UserBundle\Entity\CurrentLocation',
        'csrf_protection' => false
    ));
}

/**
 * @return string
 */
public function getName()
{
    return '';
}
}
public function putAction($id)
{
    $request = $this->getRequest();
    $method=$request->getMethod();

    $em = $this->getDoctrine()->getManager();
    $location = $em->getRepository('MobileServiceUserBundle:CurrentLocation')->find($id);

    $form = $this->createForm(new CurrentLocationType(), $location, array('method' => $method));
    $form->submit($request, false);

    if ($form->isValid()) {
        $em->persist($location);
        $em->flush();
    }
    else die('Invalid form.');

    return array(
        'location' => $form->getData(),
    );
}
带有
PUT
请求的结果:

{"location":{"id":1,"latitude":0,"longitude":0,"city":"","zip":0}}
{"location":{"id":1,"latitude":51.4681,"longitude":6.9174,"city":"Essen","zip":451361}}
带有
POST
请求的结果:

{"location":{"id":1,"latitude":0,"longitude":0,"city":"","zip":0}}
{"location":{"id":1,"latitude":51.4681,"longitude":6.9174,"city":"Essen","zip":451361}}
控制台路由的输出:调试

namespace MobileService\UserBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class CurrentLocationType extends AbstractType
{
/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('latitude')
        ->add('longitude')
        ->add('city')
        ->add('zip')
    ;
}

/**
 * @param OptionsResolverInterface $resolver
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'MobileService\UserBundle\Entity\CurrentLocation',
        'csrf_protection' => false
    ));
}

/**
 * @return string
 */
public function getName()
{
    return '';
}
}
new_profiles                      GET    ANY    ANY  /profiles/new.{_format}           
get_profiles                      GET    ANY    ANY  /profiles/{id}.{_format}          
get_locations                     GET    ANY    ANY  /locations.{_format}              
get_location                      GET    ANY    ANY  /locations/{id}.{_format}         
post_locations                    POST   ANY    ANY  /locations.{_format}              
put_location                      PUT    ANY    ANY  /locations/{id}.{_format}         
get_images                        GET    ANY    ANY  /images.{_format}   

并非所有浏览器都支持
PUT
|
PATCH
|
DELETE
请求

他们通常会发送一个
POST
请求,即使表单中有
method=“PUT”

解决方案:

namespace MobileService\UserBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class CurrentLocationType extends AbstractType
{
/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('latitude')
        ->add('longitude')
        ->add('city')
        ->add('zip')
    ;
}

/**
 * @param OptionsResolverInterface $resolver
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'MobileService\UserBundle\Entity\CurrentLocation',
        'csrf_protection' => false
    ));
}

/**
 * @return string
 */
public function getName()
{
    return '';
}
}
Symfony针对这种情况有一个简单的解决方法

在表单中添加一个名为
\u method
的隐藏输入字段,其值为
PUT
PATCH

您可以在以下两篇食谱文章中阅读有关更改请求方法的更多信息:


既然您知道您的请求将是PUT请求,那么使用以下选项似乎很愚蠢:

  $method=$request->getMethod();
相反,尝试使用以下方法:

  $method= 'PUT';
$form->handleRequest($request);
此外,$request对象应在操作中作为参数传递,而不是从request对象检索,也不是使用此参数:

$form->submit($request, false);
您应该使用以下选项:

  $method= 'PUT';
$form->handleRequest($request);
总而言之,我将使用以下代码:

public function putAction($id, Request $request)
{
    $method='PUT';

    $em = $this->getDoctrine()->getManager();
    $location = $em->getRepository('MobileServiceUserBundle:CurrentLocation')->find($id);

    $form = $this->createForm(new CurrentLocationType(), $location, array('method' => $method));
    $form->handleRequest($request);

    if ($form->isValid()) {
        $em->persist($location);
        $em->flush();
    }
    else die('Invalid form.');

    return array(
        'location' => $form->getData(),
    );
}

不要忘记请求对象的正确使用语句。

显示路由配置我现在也有同样的问题。。。你找到解决办法了吗?我已经调试好了。这是一个真正的PUT请求。我正在使用Php Storm的Rest客户机进行测试,但我尝试了_方法标志不做任何更改。我在结果中看到的都是动作前的值