背景:

我正在为Symfony写一个宁静的API。我希望客户能够使用内容类型应用程序/JSON发布到URL,并发布控制器操作正在寻找的表单对象。

我正在为此使用一个非常基本的控制器设置。让我们假设出于演示目的,即时试图身份验证简单的用户名密码组合。

public function loginAction( Request $request )
{
    $user = new ApiUser();
    $form = $this->createForm(new ApiUserType(), $user);
    if ( "POST" == $request->getMethod() ) {
        $form->bindRequest($request);
        if ( $form->isValid() ) {
            $em = $this->getDoctrine()->getEntityManager();
            $repo = $this->getDoctrine()->getRepository('ApiBundle:ApiUser');
            $userData = $repo->findOneByUsername($user->getUsername());
            if ( is_object($userData) ) {
                /** do stuff for authenticating **/
            }
            else{
                return new Response(json_encode(array('error'=>'no user by that username found')));
            }
        else{
            return new Response(json_encode(array('error'=>'invalid form')));
        }
    }
}

现在,我遇到的问题,并且我已经尝试了var_dump,直到奶牛回家为止,这是出于原因,Symfony不想使用应用程序/JSON Content-Body并使用该数据填充表单数据。

表格名称:api_apiuser

字段:用户名,密码

处理此类任务的最佳方法是什么。只要我能做到这一点,我就会接受建议。感谢您的时间。

有帮助吗?

解决方案 2

在检查该方法是否已发布并在将请求绑定到表单之前,我实际上找到了一种解决此问题的方法:我这样做:

if ( "POST" === $request->getMethod() ) {
    if (0 === strpos($request->headers->get('Content-Type'), 'application/json')){
        $data = json_decode($request->getContent(), true);
        $request->request->replace(is_array($data) ? $data : array());
    }
    $form->bindRequest($request);
    /** Rest of logic **/
}

其他提示

您需要访问原始请求主体,然后使用JSON_DECODE。您可能需要更改您的 bindRequest 类似以下内容的方法:

public function bindRequest(Request $request) 
{
       if($request->getFormat() == 'json') {
           $data = json_decode($request->getContent());
           return $this->bind($data);
        } else {
           // your standard logic for pulling data form a Request object
           return parent::bind($request);
        }
}

我还没有对SF2感到震惊,所以这更基于API,Exp。 sf1.x和框架上的演示文稿获得了我的事物。做出完全不同的方法也可能会更好 bindJsonRequest 因此,事情更加整洁。

是的,在绑定期间等待的表格是一个包含与Apiuser属性相对应的键的数组。

因此,如果您发送带有字符串的邮政请求:

{ username: 'user', password: 'pass' }

您将必须将其转换为使用 json_decode 例如:

$data = json_decode($request->getContent()); // $request->request->get('json_param_name');

然后,您将此数组绑定到表单 $form->bind($data);

该表单将更新与数组键(用户名,密码)相对应的APIUPER属性。

如果您要构建一个静止的JSON API,我会建议您使用串行序列/变压器自动化此过程,例如 https://github.com/schmittjoh/jmsserializerbundle/blob/master/resources/doc/index.rst

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top