实现REST API Symfony 3

问题描述 投票:0回答:1

我有一个现有的Symfony 3应用程序。我安装了FOSRestBundle,FOSUserBundle,NelmioCorsBundle。例如,我有2个实体:用户和关税。

关税具有id,名称,价格,描述,图像,用户(OneToMany to User)字段。用户有id,电子邮件,创建,更新,一些一对多字段,关税(ManyToOne to Tariff)。

我尝试创建User Rest Controller ::获取用户关税:

    /**
 * @Rest\Get(path="/users/{id}/tariff", name="get_user_tariff")
 *
 * @param $id
 * @return Response
 */
public function getUserTariff($id)
{
    /** @var User $user */
    $user = $this->getDoctrine()->getRepository(User::class)->find($id);
    $tariff = $this->getDoctrine()->getRepository(Tariff::class)->findBy(['id' => $user->getTariff()->getId()]);

    $encoders = [new JsonEncoder()];
    $normalizers = [new ObjectNormalizer()];
    $serializer = new Serializer($normalizers, $encoders);

    $response = new JsonResponse($serializer->serialize($tariff, 'json'));
    $response->headers->set('Content-Type', 'application/json');

    return $response;
}

作为请求的结果,我有以下JSON:

"[{\u0022id\u0022:3,\u0022name\u0022:\u0022\\u041f\\u0440\\u043e\\u0434\\u0432\\u0438\\u043d\\u0443\\u0442\\u044b\\u0439\u0022,\u0022price\u0022:7900,\u0022description\u0022:null,\u0022leadMonthLimit\u0022:3000,\u0022status\u0022:100,\u0022active\u0022:true,\u0022comingSoon\u0022:false,\u0022image\u0022:\u0022advanced.jpg\u0022,\u0022user\u0022:null,\u0022deleted\u0022:false,\u0022product\u0022:{\u0022name\u0022:\u0022\\u0410\\u0431\\u043e\\u043d\\u0435\\u043d\\u0442\\u0441\\u043a\\u0430\\u044f \\u043f\\u043b\\u0430\\u0442\\u0430 \\u043f\\u043e \\u0442\\u0430\\u0440\\u0438\\u0444\\u0443 \\u00ab\\u041f\\u0440\\u043e\\u0434\\u0432\\u0438\\u043d\\u0443\\u0442\\u044b\\u0439\\u00bb\u0022,\u0022description\u0022:\u0022\\u0414\\u0430\\u043d\\u043d\\u044b\\u0439 \\u0442\\u0430\\u0440\\u0438\\u0444 \\u043f\\u043e\\u0437\\u0432\\u043e\\u043b\\u044f\\u0435\\u0442 \\u043e\\u0431\\u0440\\u0430\\u0431\\u0430\\u0442\\u044b\\u0432\\u0430\\u0442\\u044c \\u0434\\u043e 3000 \\u043a\\u043e\\u043d\\u0442\\u0430\\u043a\\u0442\\u043e\\u0432 \\u0432 \\u043c\\u0435\\u0441\\u044f\\u0446.\u0022,\u0022price\u0022:7900,\u0022specialPrice\u0022:null,\u0022fiscalInfo\u0022:{\u0022taxSystem\u0022:null,\u0022vatSystem\u0022:null},\u0022quantity\u0022:1,\u0022photo\u0022:\u0022advanced.jpg\u0022,\u0022photoList\u0022:[\u0022advanced.jpg\u0022]},\u0022limitsDescription\u0022:\u0022\\u0414\\u0430\\u043d\\u043d\\u044b\\u0439 \\u0442\\u0430\\u0440\\u0438\\u0444 \\u043f\\u043e\\u0437\\u0432\\u043e\\u043b\\u044f\\u0435\\u0442 \\u043e\\u0431\\u0440\\u0430\\u0431\\u0430\\u0442\\u044b\\u0432\\u0430\\u0442\\u044c \\u0434\\u043e 3000 \\u043a\\u043e\\u043d\\u0442\\u0430\\u043a\\u0442\\u043e\\u0432 \\u0432 \\u043c\\u0435\\u0441\\u044f\\u0446.\u0022,\u0022ecommerce\u0022:true,\u0022modules\u0022:[\u0022tariff.modules.ecommerce\u0022],\u0022__initializer__\u0022:null,\u0022__cloner__\u0022:null,\u0022__isInitialized__\u0022:true}]"

(在db我有西里尔符号)。我可以修理它吗?

我的config.yml:

#FOSRestBundle
fos_rest:
    body_listener: true
    view:
      view_response_listener: force
    mime_types:
      json: ['application/json; charset=UTF-8', 'application/json']
    serializer:
      serialize_null: true
    body_converter:
      enabled: true
    format_listener:
      rules:
        - { path: '^/api',  priorities: ['json'], fallback_format: json, prefer_extension: true }
        - { path: '^/', priorities: [ 'html', '*/*'], fallback_format: html, prefer_extension: true }
php rest symfony serialization
1个回答
2
投票

JsonResponse将序列化你的数组,但它已经被Serializer序列化了。您现在正在序列化已经序列化的对象。

使用setJson()代替:

$response = new JsonResponse();
$response->setJson($serializer->serialize($tariff, 'json'));

看看\Symfony\Component\HttpFoundation\JsonResponse它正在做什么。然后你会看到设置Content-Type已经由JsonResponse::update完成(从JsonResponse::setJson调用)。

如果你使用JsonResponse($data)JsonResponse::setData(),则会调用\json_encode

© www.soinside.com 2019 - 2024. All rights reserved.