草庐IT

php - Symfony 和 Willdurand/Hateoas Bundle - JSON 响应上没有链接

coder 2024-04-19 原文

我正在使用 FOSRest 和 Willdurand/Hateoas bundle 。 我遵循以下示例 https://github.com/willdurand/Hateoas#configuring-links

但 JSON 响应中没有“链接”字段。

/**
 * 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;
    }

}

主要是我想显示一个指向 Roles 实体的链接,但也许更容易找出导致 SELF 链接出现问题的原因,然后再进一步。

这里是配置

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 请求中得到了这个响应

[
  {
    "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"
    }
  }
]

还有 Controller 数据。

/**
 * 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;
    }
}

最佳答案

问题是你返回了实体,你需要从一个序列化器传递来获取 hateoas 链接。

像这样:

我使用jsm_serializer

$serializer = $this->get('jms_serializer');
return new Response(
     $serializer->serialize(
         $users,
         'json',
         SerializationContext::create()->enableMaxDepthChecks()
     ),
     201
);

而不是这个:

return $users;

关于php - Symfony 和 Willdurand/Hateoas Bundle - JSON 响应上没有链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47532484/

有关php - Symfony 和 Willdurand/Hateoas Bundle - JSON 响应上没有链接的更多相关文章

  1. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

    我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

  2. ruby-on-rails - rails 目前在重启后没有安装 - 2

    我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

  3. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  4. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  5. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  6. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  7. 没有类的 Ruby 方法? - 2

    大家好!我想知道Ruby中未使用语法ClassName.method_name调用的方法是如何工作的。我头脑中的一些是puts、print、gets、chomp。可以在不使用点运算符的情况下调用这些方法。为什么是这样?他们来自哪里?我怎样才能看到这些方法的完整列表? 最佳答案 Kernel中的所有方法都可用于Object类的所有对象或从Object派生的任何类。您可以使用Kernel.instance_methods列出它们。 关于没有类的Ruby方法?,我们在StackOverflow

  8. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  9. ruby-on-rails - 如何使用 Rack 接收 JSON 对象 - 2

    我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":

  10. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

随机推荐