Этот вопрос закрыт для ответов, так как повторяет вопрос A circular reference has been detected?
@ostiwe

A circular reference has been detected when serializing the object of class как решить?

Привет, есть два класса (Entity)

User

<?php

namespace App\Entity;

use App\Repository\UserRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass=UserRepository::class)
 * @ORM\Table(name="users")
 */
class User
{

	/* Битовые маски доступные пользователю */
	const CAN_READ = 1 << 1;
	const CAN_CREATE_POST = 1 << 2;
	const CAN_UPLOAD_FILES = 1 << 3;
	const CAN_CREATE_COMMENT = 1 << 4;
	const CAN_DELETE_COMMENT = 1 << 5;
	const CAN_WRITE_MESSAGES = 1 << 6;

	const USER_BLOCKED = 1 << 0;

	/**
	 * @ORM\Id()
	 * @ORM\GeneratedValue()
	 * @ORM\Column(type="integer")
	 */
	private $id;

	/**
	 * @ORM\Column(type="string", length=255)
	 */
	private $login;

	/**
	 * @ORM\Column(type="string", length=255)
	 */
	private $email;

	/**
	 * @ORM\Column(type="string", length=255, nullable=true)
	 */
	private $first_name;

	/**
	 * @ORM\Column(type="string", length=255, nullable=true)
	 */
	private $last_name;

	/**
	 * @ORM\Column(type="integer")
	 */
	private $mask;

	/**
	 * @ORM\OneToMany(targetEntity=AccessToken::class, mappedBy="owner", orphanRemoval=true)
	 */
	private $tokens;

	/**
	 * @ORM\Column(type="string", length=255)
	 */
	private $password;

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

	public function getId(): ?int
	{
		return $this->id;
	}

	public function getLogin(): ?string
	{
		return $this->login;
	}

	public function setLogin(string $login): self
	{
		$this->login = $login;

		return $this;
	}

	public function getEmail(): ?string
	{
		return $this->email;
	}

	public function setEmail(string $email): self
	{
		$this->email = $email;

		return $this;
	}

	public function getFirstName(): ?string
	{
		return $this->first_name;
	}

	public function setFirstName(?string $first_name): self
	{
		$this->first_name = $first_name;

		return $this;
	}

	public function getLastName(): ?string
	{
		return $this->last_name;
	}

	public function setLastName(?string $last_name): self
	{
		$this->last_name = $last_name;

		return $this;
	}

	public function getMask(): ?int
	{
		return $this->mask;
	}

	public function setMask(int $mask): self
	{
		$this->mask = $mask;

		return $this;
	}

	/**
	 * @return Collection|AccessToken[]
	 */
	public function getTokens(): Collection
	{
		return $this->tokens;
	}

	public function addToken(AccessToken $token): self
	{
		if (!$this->tokens->contains($token)) {
			$this->tokens[] = $token;
			$token->setOwner($this);
		}

		return $this;
	}

	public function removeToken(AccessToken $token): self
	{
		if ($this->tokens->contains($token)) {
			$this->tokens->removeElement($token);
			// set the owning side to null (unless already changed)
			if ($token->getOwner() === $this) {
				$token->setOwner(null);
			}
		}

		return $this;
	}

	public function getPassword(): ?string
	{
		return $this->password;
	}

	public function setPassword(string $password): self
	{
		$this->password = $password;

		return $this;
	}
}


AccessToken

<?php

namespace App\Entity;

use App\Repository\AccessTokenRepository;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass=AccessTokenRepository::class)
 */
class AccessToken
{
	/**
	 * @ORM\Id()
	 * @ORM\GeneratedValue()
	 * @ORM\Column(type="integer")
	 */
	private $id;

	/**
	 * @ORM\ManyToOne(targetEntity=User::class, inversedBy="tokens")
	 * @ORM\JoinColumn(nullable=false)
	 */
	private $owner;

	/**
	 * @ORM\Column(type="string", length=255)
	 */
	private $value;

	/**
	 * @ORM\Column(type="integer")
	 */
	private $mask;

	/**
	 * @ORM\Column(type="integer")
	 */
	private $created;

	/**
	 * @ORM\Column(type="integer")
	 */
	private $expired;

	public function getId(): ?int
	{
		return $this->id;
	}

	public function getOwner(): ?User
	{
		return $this->owner;
	}

	public function setOwner(?User $owner): self
	{
		$this->owner = $owner;

		return $this;
	}

	public function getValue(): ?string
	{
		return $this->value;
	}

	public function setValue(string $value): self
	{
		$this->value = $value;

		return $this;
	}

	public function getMask(): ?int
	{
		return $this->mask;
	}

	public function setMask(int $mask): self
	{
		$this->mask = $mask;

		return $this;
	}

	public function getCreated(): ?int
	{
		return $this->created;
	}

	public function setCreated(int $created): self
	{
		$this->created = $created;

		return $this;
	}

	public function getExpired(): ?int
	{
		return $this->expired;
	}

	public function setExpired(int $expired): self
	{
		$this->expired = $expired;

		return $this;
	}

	public function generate()
	{
		try {
			$token = bin2hex(random_bytes(20));
		} catch (\Exception $e) {
			return false;
		}

		$this->value = $token;

		return $this;
	}
}



Есть роут
роут

/** @Route("/users") */
	public function getUsers()
	{
		$users = $this->getDoctrine()->getRepository(User::class)->findAll();
		return $this->json($users);
	}



При запросе данного роута возникает данная ошибка: "A circular reference has been detected when serializing the object of class "App\Entity\User" (configured limit: 1)."

В ходе "экспериментов" я обнаружил, если в AccessToken убрать метод getOwner, то ошибка исчезнет, однако, данное решение мне не подходит.

Может кто сталкивался с этим? Как решить данную проблему?
  • Вопрос задан
  • 1305 просмотров
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы