comportmento inaspettato dopo aver cambiato le relazioni tra entity framework;

il mio incubo di un giorno continua …..

dopo aver implorato una soluzione di successo in un thread precedente in cui ho bisogno di modificare le mie relazioni inter-entity framework;, ora ricevo questo errore quando provo a registrare un utente nell'app:

CRITICAL - Uncaught PHP Exception Symfony\Component\Debug\Exception\UndefinedMethodException: "Attempted to call method "getRole" on class "Closure"." at C:\Dropbox\xampp\htdocs\etrack3\src\Ampisoft\Bundle\etrackBundle\Entity\Users.php line 234

Sono passato da una relazione manyMany a una manyToOne / OneToMany tra un'entity framework; Users / Roles.

Ho letto che serializzare potrebbe causare il problema, ma Ive l'ha tolto e non ha fatto alcuna differenza. I resti dei methods necessari per la serializzazione sono ancora presenti quindi ignorare (a less che non si tratti del problema).

Per favore qualcuno potrebbe dirmi cosa ho fatto di sbagliato? Mi chiedo se è meglio rottamare tutte le tabelle del database e ricominciare !!!!

ecco la class di entity framework;.

 /** * user * * @ORM\Table(name="users") * @ORM\Entity(repositoryClass="Ampisoft\Bundle\etrackBundle\Entity\UsersRepository") */ class Users implements UserInterface { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var string * * @ORM\Column(name="username", type="string", length=25, unique=true) */ private $username; /** * @var string * * @ORM\Column(name="password", type="string", length=64) */ private $password; /** * @ORM\Column(name="firstname", type="string", length=25) */ private $firstname; /** * @ORM\Column(name="surname", type="string", length=25) */ private $lastname; /** * @var boolean * * @ORM\Column(name="isActive", type="boolean") */ private $isActive = 1; /** * @var string * * @ORM\Column(name="email", type="string", length=255, unique=true) */ private $email; /** * @var \DateTime * * @ORM\Column(name="lastLogged", type="string") */ private $lastLogged = '-0001-11-30 00:00:00'; /** * @var string; * * @ORM\Column(name="salt", type="string", length=255) */ private $salt; /** * @ORM\ManyToOne(targetEntity="Roles", inversedBy="users") * */ private $roles; /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set Id * * @return integer */ public function setId($id) { $this->id = $id; return $this; } /** * Set username * * @param string $username * @return user */ public function setUsername($username) { $this->username = $username; return $this; } /** * Get username * * @return string */ public function getUsername() { return $this->username; } /** * Set password * * @param string $password * @return user */ public function setPassword($password) { $this->password = $password; return $this; } /** * Get password * * @return string */ public function getPassword() { return $this->password; } /** * Set isActive * * @param boolean $isActive * @return user */ public function setIsActive($isActive) { $this->isActive = $isActive; return $this; } /** * Get isActive * * @return boolean */ public function getIsActive() { return $this->isActive; } /** * Set email * * @param string $email * @return user */ public function setEmail($email) { $this->email = $email; return $this; } /** * Get email * * @return string */ public function getEmail() { return $this->email; } /** * Set lastLogged * * @param \DateTime $lastLogged * @return user */ public function setLastLogged($lastLogged) { $this->lastLogged = $lastLogged; return $this; } /** * Get lastLogged * * @return \DateTime */ public function getLastLogged() { return $this->lastLogged; } public function __construct() { $this->roles = new ArrayCollection(); $this->isActive = true; } /** * @inheritDoc */ public function getRoles() { $roles = arrays(); foreach ($this->roles as $role) { $roles[] = $role->getRole(); } return $roles; } /** * @param $roles * @return $this */ public function setRoles($roles) { $this->roles = $roles; return $this; } /** * @inheritDoc */ public function eraseCredentials() { } /** * @inheritDoc */ public function getSalt() { return $this->salt; } public function setSalt($salt) { $this->salt = $salt; return $this; } public function isAccountNonExpired() { return true; } public function isAccountNonLocked() { return true; } public function isCredentialsNonExpired() { return true; } public function isEnabled() { return $this->isActive; } /** * Add roles * * @param \Ampisoft\Bundle\etrackBundle\Entity\Roles $roles * @return users */ public function addRoles(Roles $roles) { $this->roles[] = $roles; return $this; } /** * Remove roles * * @param \Ampisoft\Bundle\etrackBundle\Entity\Roles $roles */ public function removeRoles(Roles $roles) { $this->roles->removeElement($roles); } /** * Set firstname * * @param string $firstname * @return users */ public function setFirstname($firstname) { $this->firstname = $firstname; return $this; } /** * Get firstname * * @return string */ public function getFirstname() { return $this->firstname; } /** * Set lastname * * @param string $lastname * @return users */ public function setLastname($lastname) { $this->lastname = $lastname; return $this; } /** * Get lastname * * @return string */ public function getLastname() { return $this->lastname; } /** * @see \Serializable::serialize() */ /** * Serializes the content of the current User object * @return string */ public function serialize() { return \json_encode( arrays($this->username, $this->password, $this->salt, $this->roles, $this->id)); } /** * Unserializes the given string in the current User object * @param serialized */ public function unserialize($serialized) { list($this->username, $this->password, $this->salt, $this->roles, $this->id) = \json_decode( $serialized); } } 

aggiornamento 1 ha funzionato, ma ha prodotto un nuovo errore Im andando a spostarlo in una nuova domanda quando il timer di post mi consente.

Catchable Fatal Error: Argument 4 passed to Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken::__construct() must be of the type arrays, object given, called in C:\Dropbox\xampp\htdocs\etrack3\vendor\symfony\symfony\src\Symfony\Component\Security\Core\Authentication\Provider\UserAuthenticationProvider.php on line 96 and defined

Ciao, penso che quello che vuoi non sia questo

 public function getRoles() { $roles = arrays(); foreach ($this->roles as $role) { $roles[] = $role->getRole(); } return $roles; } 

ma questo

 public function getRoles() { return $this->roles; } 

I ruoli dovrebbero essere già una ArrayCollection, quindi call getRole nella class di ruolo (presumo) sembra essere ansible.

Se si utilizza un IDE come Eclipse, la class è Doctrine\Common\Collections\ArrayCollection; questa dovrebbe essere la tua collezione di ruoli, ti suggerirei anche che stai usando un IDE per fare qualcosa del genere (per tipo suggerimento)

 //... at the top of the class file before the class deceleration use Doctrine\Common\Collections\ArrayCollection; /** * @param ArrayCollection $roles */ public function setRoles(ArrayCollection $roles) { //.. type cast the input to allow only use of ArrayCollection class $this->roles = $roles; } /** * @return ArrayCollection */ public function getRoles() { return $this->roles; } 

Inoltre, ci sono buone probabilità che tu imposti $this->roles come arrays standard ad un certo punto. È sempre necessario digitare cast il proprio input per una class specifica se può accettare solo quel tipo di class per escludere errori come l'utilizzo di un arrays semplice.

L'ultima cosa, generalmente è protetta per le properties;, è preferibile perché quest'ultima è ansible estendere la class, non è accessibile al di fuori della class molto simile a quella privata, ma a differenza del privato è accessibile nelle classi ereditarie.