Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Symfony和Wildurand/Hateoas Bundle - JSON存储库上没有链接

Symfony和Wildurand/Hateoas Bundle - JSON存储库上没有链接
EN

Stack Overflow用户
提问于 2017-11-28 05:13:07
回答 2查看 614关注 0票数 4

我正在使用FOSRest和Willdurand/Hateoas包。我遵循https://github.com/willdurand/Hateoas#configuring-links的例子

但是在JSON响应上没有“链接”字段。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Users
 *
 * @ORM\Table(name="users")
 * @ORM\Entity
 * @Serializer\ExclusionPolicy("ALL")
 * @Hateoas\Relation("self", href="expr('/users' ~ object.getId())")
 */
class User
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @Serializer\Groups({"Default", "Deserialize"})
     * @Serializer\Expose()
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=30)
     * @Assert\NotBlank()
     * @Assert\Length(max="30", min="5")
     * @Serializer\Groups({"Default", "Deserialize"})
     * @Serializer\Expose()
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="email", type="string", length=30)
     * @Assert\NotBlank()
     * @Assert\Email()
     * @Assert\Length(max="30")
     * @Serializer\Groups({"Default", "Deserialize"})
     * @Serializer\Expose()
     */
    private $email;

    /**
     * @var string
     *
     * @ORM\Column(name="username", type="string", length=15)
     * @Assert\NotBlank()
     * @Assert\Length(max="15", min="3")
     * @Serializer\Groups({"Default", "Deserialize"})
     * @Serializer\Expose()
     */
    private $username;

    /**
     * @var string
     *
     * @ORM\Column(name="password", type="string", length=32)
     * @Assert\NotBlank()
     */
    private $password;

    /**
     * @var string
     *
     * @ORM\Column(name="active", type="boolean", length=32)
     * @Serializer\Groups({"Default", "Deserialize"})
     * @Serializer\Expose()
     */
    private $active = true;

    /**
     * @var ArrayCollection
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Role", inversedBy="user")
     * @Serializer\Expose()
     */
    private $roles;

    public function __construct()
    {
        $this->roles = new ArrayCollection();
    }

    /**
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @param string $name
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * @return string
     */
    public function getEmail()
    {
        return $this->email;
    }

    /**
     * @param string $email
     */
    public function setEmail($email)
    {
        $this->email = $email;
    }

    /**
     * @return string
     */
    public function getUsername()
    {
        return $this->username;
    }

    /**
     * @param string $username
     */
    public function setUsername($username)
    {
        $this->username = $username;
    }

    /**
     * @return string
     */
    public function getPassword()
    {
        return $this->password;
    }

    /**
     * @param string $password
     */
    public function setPassword($password)
    {
        $this->password = $password;
    }

    /**
     * @return string
     */
    public function getActive()
    {
        return $this->active;
    }

    /**
     * @param string $active
     */
    public function setActive($active)
    {
        $this->active = $active;
    }

    /**
     * @return Collection
     */
    public function getRoles()
    {
        return $this->roles;
    }

    /**
     * @param ArrayCollection $roles
     */
    public function setRoles($roles)
    {
        $this->roles = $roles;
    }

}

主要是我想显示到角色实体的链接,但可能更容易找出是什么导致了自我链接的问题,然后更进一步。

这是配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fos_rest:
    routing_loader:
        default_format: json
        include_format: false
    view:
        view_response_listener: 'force'
    body_converter:
        enabled: true
        validate: true
        validation_errors_argument: validationErrors
    param_fetcher_listener: true
    exception:
        enabled: true
        exception_controller: 'AppBundle\Controller\ExceptionController::showAction'
    serializer:
        groups: ['Default']

sensio_framework_extra:
    view:
        annotations: true
    request:
        converters: true

这个配置很好,这意味着除了没有链接之外,所有端点都能正常工作。

此时,我在 get 请求上得到了响应

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[
  {
    "id": 1,
    "name": "Test name",
    "email": "test@email.com",
    "username": "toskadv",
    "active": true
  },
  {
    "id": 2,
    "name": "Test name",
    "email": "test@email.com",
    "username": "toskadv",
    "active": true
  },
  {
    "id": 3,
    "name": "Test name",
    "email": "test@email.com",
    "username": "toskadv",
    "active": true,
    "roles": {
      "id": 1,
      "name": "ROLE_USER"
    }
  }
]

也有控制器数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Class UsersController
 * @package AppBundle\Controller
 */
class UsersController extends AbstractController
{
    use ControllerTrait;

    /**
     * @Rest\View()
     */
    public function getUsersAction()
    {
        $users = $this->getDoctrine()->getRepository('AppBundle:User')->findAll();

        return $users;
    }

    /**
     * @param User $user
     * @param ConstraintViolationListInterface $validationErrors
     *
     * @Rest\View(statusCode=201)
     * @ParamConverter("user", converter="fos_rest.request_body")
     * @Rest\NoRoute()
     *
     * @return User $user
     */
    public function postUsersAction(User $user, ConstraintViolationListInterface $validationErrors)
    {
        if (count($validationErrors) > 0) {
            throw new ValidationException($validationErrors);
        }
        $em = $this->getDoctrine()->getManager();
        $role = $em->getRepository('AppBundle:Role')->find(1);
        $user->setRoles($role);

        $em->persist($user);
        $em->flush();

        return $user;
    }

    /**
     * @param User|null $user
     *
     * @Rest\View()
     */
    public function deleteUserAction(User $user = null) {
        if (null === $user) {
            return $this->view(null, 404);
        }

        $em = $this->getDoctrine()->getManager();
        $em->remove($user);
        $em->flush();
    }


    /**
     * @param User $user
     * @return User|\FOS\RestBundle\View\View|null
     *
     * @Rest\View()
     */
    public function getUserAction(User $user)
    {
        if (null === $user) {
            return $this->view(null, 404);
        }

        return $user;
    }

    /**
     * @param Role $role
     * @return Role|\FOS\RestBundle\View\View
     *
     * @Rest\View()
     */
    public function getRoleAction(Role $role)
    {
        if (null === $role) {
            return $this->view(null, 404);
        }

        return $role;
    }

    /**
     * @param User $user
     * @return \Doctrine\Common\Collections\Collection
     *
     * @Rest\View()
     */
    public function getUserRolesAction(User $user)
    {
        return $user->getRoles();
    }

    /**
     * @param User $user
     * @param Role $role
     * @param ConstraintViolationListInterface $validationErrors
     *
     * @Rest\View(statusCode=201)
     * @ParamConverter("role", converter="fos_rest.request_body", options={"deserializationContext"={"groups"={"Deserialize"}}})
     * @Rest\NoRoute()
     *
     * @return Role
     */
    public function postUserRolesAction(User $user, Role $role, ConstraintViolationListInterface $validationErrors)
    {
        if (count($validationErrors) > 0) {
         throw new ValidationException($validationErrors);
        }

        $role->setUser($user);

        $em = $this->getDoctrine()->getManager();
        $user->getRoles()->add($role);

        $em->persist($user);
        $em->flush();

        return $role;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-28 05:23:54

问题是,返回实体时,需要从序列化程序中传递来获取hateoas链接。

就像这样:

我使用jsm_serializer

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$serializer = $this->get('jms_serializer');
return new Response(
     $serializer->serialize(
         $users,
         'json',
         SerializationContext::create()->enableMaxDepthChecks()
     ),
     201
);

而不是这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return $users;
票数 1
EN

Stack Overflow用户

发布于 2017-11-30 05:57:50

以我为耻:/

问题是在第一步,我只是没有在AppKernel.php中包含包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new Bazinga\Bundle\HateoasBundle\BazingaHateoasBundle(),

这是一条漏线。没有借口。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47532484

复制
相关文章
Python 文件存储:pickle 和 json 库的使用
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:Python 文件存储:pickle 和 json 库的使用 ---- Python 文件存储:pickle 和 json 库的使用 1.使用 pickle 存储 Python 对象 2.使用 json 存储 Python 对象 ---- 1.使用 pickle 存储 Python 对象 在 Python 中,
小嗷犬
2022/11/15
3.3K0
架构之:REST和HATEOAS
我们知道REST是一种架构方式,它只是指定了六种需要遵循的基本原则,但是它指定的原则都比较宽泛,我们需要一种更加具象的约束条件来指导我们的编码。这就是HATEOAS。
程序那些事
2021/07/26
6950
存储类别、链接和内存管理(二)
自动存储类别的变量具有自动存储期、块作用域且无链接。默认情况下,声明在块或函数头中的任何变量都属于自动存储类别。使用auto作为存储类别说明符。
哆哆jarvis
2022/08/23
5150
存储类别、链接和内存管理(二)
静态链接库和动态链接库的区别
Linux下得库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。面对比一下两者:
狼啸风云
2019/11/03
8.4K0
Symfony 3 框架+Elasticsearch
目录src/AppBundle/Controller/SearchController.php
Stanley Sun
2019/09/23
7890
nginx配置Symfony
server { listen 80; server_name blog.phpfs.com; root /data/web; rewrite ^/a
苦咖啡
2018/04/28
1.7K0
40_HATEOAS
http://mpvideo.qpic.cn/0b784iaagaaasyaoht6kuzpvbywdapraaaya.f10002.mp4?dis_k=90004dbec5391c564de7120
宿春磊Charles
2022/03/29
2270
Eclipse C++配置静态链接库和动态链接库
转:https://blog.csdn.net/iteye_20658/article/details/82650699
墨文
2020/02/28
3.5K0
Eclipse C++配置静态链接库和动态链接库
C语言 | 什么是静态链接库和动态链接库?
今天分享的是静态链接库和动态链接库的相关知识,并且自己动手写一个简单的静态函数库和动态函数库,来体验这个流程。
飞哥
2020/08/11
4.6K0
C语言 | 什么是静态链接库和动态链接库?
Symfony是什么
众所周知前面有说到PHP的七大框架,接下来就来说说Symfony框架,希望说的对大家有所帮助。
叫我可儿呀
2019/11/26
2.1K0
Symfony是什么
你必须知道的 17 个 Composer 最佳实践(已更新至 22 个)
尽管大多数 PHP 开发人员都知道如何使用 Composer ,但并不是所有的人都在有效地或以最好的方式使用它。 所以我决定总结一些对我日常工作流程很重要的东西。 大部分技巧的理念是「 Play it safe 」,这意味着如果有更多的方法来处理某些事情,我会使用最不容易出错的方法。
做个快乐的码农
2021/11/29
7.6K0
你必须知道的 17 个 Composer 最佳实践(已更新至 22 个)
Yar:用于侦察Github上存储库用户和组织的工具
Yar通过正则表达式,熵(entropy)或两者进行搜索,你可以根据实际情况自行选择。你可以把yar想象成是truffleHog的升级版,它能做truffleHog可以做的所有事情,甚至比它做的更多更好!
FB客服
2019/10/10
9730
【PHP】Composer 介绍
官网地址:Composer (getcomposer.org),目前个人看到的最新版为 2.4.4。
阿东
2023/02/23
1.6K0
【PHP】Composer 介绍
如何在 CentOS 上启用EPEL存储库
EPEL(Extra Packages for Enterprise Linux)存储库提供了标准 Red Hat 和 CentOS 存储库中未包含的其他软件包。EPEL 存储库的创建是因为 Fedora 贡献者希望使用他们在 Red Hat Enterprise Linux(RHEL)及其衍生产品(如CentOS,Oracle Linux和Scientific Linux)上维护的软件包。
用户8705033
2021/06/08
1.8K0
【PHP】Composer 介绍
官网地址:Composer (getcomposer.org),目前个人看到的最新版为 2.4.4。
阿东
2022/12/21
1.6K0
【PHP】Composer 介绍
【CLion】解决CLion链接Linux服务器相关库没有代码补全
错误原因: 可能是因为没有正确配置CMake,即没有写CMakeLists.txt相关指令。 解决方法: 将CMakeLists.txt的大致内容补全即可,如下图所示: 其他补充: 配置CLion与Linux服务器——Clion拉取linux文件。 其他相关方法——clion remote模式无代码补全(找不到Linux头文件)
半生瓜的blog
2023/05/13
1.7K0
【CLion】解决CLion链接Linux服务器相关库没有代码补全
Symfony 服务容器入门
本文是依赖注入(Depeendency Injection)系列教程的第 3 篇文章,本系列教程主要讲解如何使用 PHP 实现一个轻量级服务容器,教程包括:
柳公子
2018/09/17
3.4K0
Spring认证指南:了解如何使用 Spring 创建超媒体驱动的 RESTful Web 服务
本指南将引导您完成使用 Spring 创建“Hello, World”超媒体驱动的 REST Web 服务的过程。
IT胶囊
2022/03/07
4K0
Spring认证指南:了解如何使用 Spring 创建超媒体驱动的 RESTful Web 服务
撸个 symfony4(二)
目标其实是完成如下的需求,如果有想看源码的,可以看下sf官网出的一个demo。
仇诺伊
2020/04/24
2.4K0
撸个 symfony4(二)
点击加载更多

相似问题

如何在Symfony2上使用Hateoas Bundle创建绝对url

12

使用HATEOAS链接查询Spring数据Rest存储库?

11

willdurand hateoas bundle分页路由问题

10

带有Symfony的Bazinga Hateoas中的多个链接

16

Spring HATEOAS链接

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文