加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – Symfony和Wildurand / Hateoas Bundle – 没有关于JSON r

发布时间:2020-12-13 16:10:01 所属栏目:PHP教程 来源:网络整理
导读:我正在使用FOSRest和Willdurand / Hateoas捆绑. 我按照例子来说 https://github.com/willdurand/Hateoas#configuring-links 但JSON响应中没有“链接”字段. /** * Users * * @ORMTable(name="users") * @ORMEntity * @SerializerExclusionPolicy("ALL") *
我正在使用FOSRest和Willdurand / Hateoas捆绑.
我按照例子来说
https://github.com/willdurand/Hateoas#configuring-links

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

/**
 * Users
 *
 * @ORMTable(name="users")
 * @ORMEntity
 * @SerializerExclusionPolicy("ALL")
 * @HateoasRelation("self",href="expr('/users' ~ object.getId())")
 */
class User
{
    /**
     * @var integer
     *
     * @ORMColumn(name="id",type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="IDENTITY")
     * @SerializerGroups({"Default","Deserialize"})
     * @SerializerExpose()
     */
    private $id;

    /**
     * @var string
     *
     * @ORMColumn(name="name",type="string",length=30)
     * @AssertNotBlank()
     * @AssertLength(max="30",min="5")
     * @SerializerGroups({"Default","Deserialize"})
     * @SerializerExpose()
     */
    private $name;

    /**
     * @var string
     *
     * @ORMColumn(name="email",length=30)
     * @AssertNotBlank()
     * @AssertEmail()
     * @AssertLength(max="30")
     * @SerializerGroups({"Default","Deserialize"})
     * @SerializerExpose()
     */
    private $email;

    /**
     * @var string
     *
     * @ORMColumn(name="username",length=15)
     * @AssertNotBlank()
     * @AssertLength(max="15",min="3")
     * @SerializerGroups({"Default","Deserialize"})
     * @SerializerExpose()
     */
    private $username;

    /**
     * @var string
     *
     * @ORMColumn(name="password",length=32)
     * @AssertNotBlank()
     */
    private $password;

    /**
     * @var string
     *
     * @ORMColumn(name="active",type="boolean",length=32)
     * @SerializerGroups({"Default","Deserialize"})
     * @SerializerExpose()
     */
    private $active = true;

    /**
     * @var ArrayCollection
     * @ORMManyToOne(targetEntity="AppBundleEntityRole",inversedBy="user")
     * @SerializerExpose()
     */
    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: 'AppBundleControllerExceptionController::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,{
    "id": 3,"active": true,"roles": {
      "id": 1,"name": "ROLE_USER"
    }
  }
]

还有控制器数据.

/**
 * Class UsersController
 * @package AppBundleController
 */
class UsersController extends AbstractController
{
    use ControllerTrait;

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

        return $users;
    }

    /**
     * @param User $user
     * @param ConstraintViolationListInterface $validationErrors
     *
     * @RestView(statusCode=201)
     * @ParamConverter("user",converter="fos_rest.request_body")
     * @RestNoRoute()
     *
     * @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
     *
     * @RestView()
     */
    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|FOSRestBundleViewView|null
     *
     * @RestView()
     */
    public function getUserAction(User $user)
    {
        if (null === $user) {
            return $this->view(null,404);
        }

        return $user;
    }

    /**
     * @param Role $role
     * @return Role|FOSRestBundleViewView
     *
     * @RestView()
     */
    public function getRoleAction(Role $role)
    {
        if (null === $role) {
            return $this->view(null,404);
        }

        return $role;
    }

    /**
     * @param User $user
     * @return DoctrineCommonCollectionsCollection
     *
     * @RestView()
     */
    public function getUserRolesAction(User $user)
    {
        return $user->getRoles();
    }

    /**
     * @param User $user
     * @param Role $role
     * @param ConstraintViolationListInterface $validationErrors
     *
     * @RestView(statusCode=201)
     * @ParamConverter("role",converter="fos_rest.request_body",options={"deserializationContext"={"groups"={"Deserialize"}}})
     * @RestNoRoute()
     *
     * @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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读