Symfony получает ошибку при реализации 2 интерфейсов

Здравствуйте, у меня есть пользователь Entity, я хочу реализовать UserInterface и ObjectManagerAware следующим образом:

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Persistence\ObjectManagerAware;
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\Common\Persistence\Mapping\ClassMetadata;
use Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface;
use Symfony\Component\Security\Core\User\UserInterface;


/**
 * User
 *
 * @ORM\Table(name = "User")
 * @ORM\Entity(repositoryClass = "AppBundle\Repository\UserRepository")
 */
class User implements UserInterface, ObjectManagerAware
{

    /**
     * @var string
     *
     * @ORM\Column(name = "Id", type = "string", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy = "UUID")
     */
    private $Id;

    /**
     * @var string
     *
     * @ORM\Column(name = "Username", type = "string", length=255, nullable=false)
     */
    private $username;

    /**
     * @var string
     *
     * @ORM\Column(name = "Email", type = "string", length=255, nullable=false)
     */
    private $Email;

    /**
     * @var string
     *
     * @ORM\Column(name = "Password", type = "string", length=255, nullable=false)
     */
    private $Password;

    /**
     * @var string
     *
     * @ORM\Column(name = "Salt", type = "string", length=5, nullable=false)
     */
    private $Salt;

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @var boolean
     *
     * @ORM\Column(name = "IsActive", type = "boolean", nullable=true)
     */
    private $IsActive;

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

    /**
     * @var string
     */
    private $Role;

    /**
     * @var string
     */
    private $plainPassword;

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


    public function __construct($username)
    {
        $now = new \DateTime("now");
        $nowText = $now->format('Y-m-d H:i:s');

        $this->setUsername($username);
        if ($this->getId() == null) {
            $this->setIsActive(true);
            $this->setCreatedAt($nowText);
            $this->setModifiedAt($nowText);
        } else {
            $this->setModifiedAt($nowText);
        }
    }

    public function getId()
    {
        return $this->Id;
    }

    public function getUsername()
    {
        return $this->username;
    }

    public function getEmail()
    {
        return $this->Email;
    }

    public function getPassword()
    {
        return $this->Password;
    }

    public function getSalt()
    {
        return $this->Salt;
    }

    public function getCreatedAt()
    {
        return $this->CreatedAt;
    }

    public function getModifiedAt()
    {
        return $this->ModifiedAt;
    }

    public function getRoles()
    {
        return [
            'AWARDEE'
        ];
    }

    /*
  public function getUserRole(){
     $userRole = $this->em->getRepository('AppBundle:UserRole')->findOneBy(['UserId'=>$this->Id]);
     return $userRole->getRole();
  }
  */

    public function getRole()
    {
        return $this->Role;
    }

    public function setRole($role)
    {
        $this->Role = $role;
    }

    public function getFullname()
    {
        return $this->Fullname;
    }

    public function getDisplayname()
    {
        return $this->Displayname;
    }

    public function getFirstname()
    {
        return $this->Firstname;
    }

    public function getMiddlename()
    {
        return $this->Middlename;
    }

    public function getLastname()
    {
        return $this->Lastname;
    }

    public function getBirthdate()
    {
        return $this->Birthdate;
    }

    public function getBirthplace()
    {
        return $this->Birthplace;
    }

    public function getGender()
    {
        return $this->Gender;
    }

    public function getGenderName()
    {
        if ($this->Gender == 1) {
            return 'Laki-laki';
        } elseif ($this->Gender == 2) {
            return 'Perempuan';
        }

    }

    public function getJob()
    {
        return $this->Job;
    }

    public function getIdNumber()
    {
        return $this->IdNumber;
    }

    public function getIsActive()
    {
        return $this->IsActive;
    }

    public function getNotes()
    {
        return $this->Notes;
    }

    public function getPlainPassword()
    {
        return $this->plainPassword;
    }

    public function getNikNumber()
    {
        return $this->NikNumber;
    }

    public function eraseCredentials()
    {

    }

    public function setUsername($username)
    {
        $this->username = $username;
    }

    public function setEmail($email)
    {
        $this->Email = $email;
    }

    public function setPlainPassword($password)
    {
        $this->plainPassword = $password;
    }

    public function setPassword($password)
    {
        $this->Password = $password;
    }

    public function setSalt($item)
    {
        $this->Salt = $item;
    }

    public function setCreatedAt($item)
    {
        $this->CreatedAt = $item;
    }

    public function setModifiedAt($item)
    {
        $this->ModifiedAt = $item;
    }

    public function setFullname($item)
    {
        $this->Fullname = $item;
    }

    public function setDisplayname($item)
    {
        $this->Displayname = $item;
    }

    public function setFirstname($item)
    {
        $this->Firstname = $item;
    }

    public function setMiddlename($item)
    {
        $this->Middlename = $item;
    }

    public function setLastname($item)
    {
        $this->Lastname = $item;
    }

    public function setBirthdate($item)
    {
        $this->Birthdate = $item;
    }

    public function setBirthplace($item)
    {
        $this->Birthplace = $item;
    }

    public function setGender($item)
    {
        $this->Gender = $item;
    }

    public function setJob($item)
    {
        $this->Job = $item;
    }

    public function setIdNumber($item)
    {
        $this->IdNumber = $item;
    }

    public function setIsActive($item)
    {
        $this->IsActive = $item;
    }

    public function setNotes($item)
    {
        $this->Notes = $item;
    }

    public function setNikNumber($item)
    {
        $this->NikNumber = $item;
    }

    public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata)
    {
        $this->em = $objectManager;
    }
}

Мне нужно ObjectManagerAware, чтобы добавить в эту сущность пользовательскую функцию запроса.

но я получил ошибку:

HTTP 500 Internal Server Error
Serialization of 'Closure' is not allowed

Я получаю ошибку только при доступе к зарегистрированному пользователю, но если я выхожу из системы, веб не ошибка

Почему у меня возникла ошибка и как ее решить?

вы пробовали использовать оба интерфейса по отдельности?

treyBake 13.07.2018 12:38

да, я пробовал это в другом объекте, и он работает правильно

yozawiratama 13.07.2018 12:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, что Symfony пытается сериализовать весь объект User в сеанс, и некоторые поля не сериализуемы. Вы должны реализовать интерфейс \serializable и добавить только важные поля в метод сериализации.

class User implements UserInterface, ObjectManagerAware, \Serializable 

{
  ...
public function serialize()
{
    return serialize(array(
        $this->id,
        $this->username,
        $this->password
    ));
}


public function unserialize($serialized)
{
    list (
        $this->id,
        $this->username,
        $this->password
    ) = unserialize($serialized, array('allowed_classes' => false));
}

Другие вопросы по теме