背景:
我正在symfony上编写一个RESTful API.我希望客户端能够使用内容类型application/json发布到url并发布控制器操作正在查找的表单的json对象.
我正在使用一个非常基本的控制器设置.让我们假设为了演示目的,我试图验证一个简单的用户名密码组合.
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')));
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在问题,我已经尝试过var_dumping这个直到奶牛回家,这是因为symfony不想拿应用程序/ json内容体并使用该数据来填充表单数据.
表格名称:api_apiuser
字段:用户名,密码
处理此类任务的最佳方法是什么.只要我能做到这一点,我愿意接受建议.感谢您抽出宝贵时间.
您需要访问RAW请求主体,然后使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
我还没有真正搞乱SF2,所以这更基于API,exp猜测.与sf1.x和我从框架的演示文稿中获得的东西.制作一个完全不同的方法也可能更好,bindJsonRequest因为事情更加整洁.
我实际上找到了一种类似的方法来解决这个问题,在检查方法是否发布之后以及在将请求绑定到表单之前我执行此操作:
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 **/
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6033 次 |
| 最近记录: |