【问题标题】:Implement REST API Symfony 3实现 REST API Symfony 3
【发布时间】:2018-12-13 11:28:19
【问题描述】:

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

资费有id、name、price、description、image、user(OneToMany to User)字段。 用户有id、email、created、updated、一些一对多的字段、关税(ManyToOne to Tariff)。

我尝试创建 UserRestController::getUserTariff:

    /**
 * @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}]"

(在数据库中我有西里尔符号)。我可以修复它吗?

我的 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】:

    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

    【讨论】:

    • 我更改了我的代码:$response = new JsonResponse(); $response->setJson($serializer->serialize($tariff, 'json')); 但结果是一样的
    • 我认为斯蒂芬是对的。也尝试使用jmsyst.com/bundles/JMSSerializerBundle,一个很好的序列化解决方案
    • 好吧,我尝试执行以下操作:json_encode($serializer->normalize($data), JSON_UNESCAPED_UNICODE) 并且数据正常。我认为序列化程序的问题。你知道出了什么问题吗? :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 2013-10-17
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    相关资源
    最近更新 更多