Je travaille sur Symfony 2.0.16
J'ai dans mon utilisateurProvider la méthode getroles p> et mon entité ROL a l'interface de rôle P> mais quand j'essaie de vous connecter, je reçois l'erreur suivante p> Erreur fatale: appelez à une fonction de membre getrole () sur un objet non-objet en C: \ users \ julian \ code \ paqueadero \ Vendor \ symfony \ src \ symfony \ bundle \ SecurityBundle \ Datacollector \ SecurityDatacollector.php en ligne 57 P>
blockQuote> lecture de la classe SecurityDatacollecteur, l'erreur est lancée par une fermeture p> maintenant je change ceci en p> à ma surprise,
$ rôle code> est un objet rol mais
3 Réponses :
J'ai trouvé la solution que le problème est un bug SERIALIZE / SERIALIZE / UNERIALISEZ SERIALIZEZ SERIALIZE UTILISANT JSON_ENCODE / JSON_DECODE JSON> MÉTHODES class User implements \Serializable
//...
/**
* Serializes the content of the current User object
* @return string
*/
public function serialize()
{
return \json_encode(
array($this->username, $this->password, $this->salt,
$this->rol, $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->rol, $this->id) = \json_decode(
$serialized);
}
Merci de m'avoir sauvé un autre jour à la recherche de ce qui va mal avec mon code. Je vais juste revenir à 5.3.x. J'ai eu des tonnes de problèmes à cause de 5.4.
Plus d'informations dans la "question officielle": Github.com/symfony/symfony/issues/3691<< a>
Thks pour la référence :) Mais comme Ztere0 a dit, il y a une solution officielle sur Github
@Yotannch c'était la solution que j'ai trouvée ^ _ ^
Votre réponse m'a beaucoup aidé, mais on dirait que des rôles ne sont pas sérialisés, savez-vous ce qui peut être faux?
J'ai eu le même problème (Windows, PHP 5.4.5), mis à jour à 5.4.7 et il n'a toujours pas fonctionné. Néanmoins, je suis proposé une solution de contournement qui nécessite moins de maintenance (lors de l'écrasement des fonctions de sérialisation comme décrit dans l'article que vous avez mentionné, vous devrez les tenir à jour lors de l'ajout / suppression de champs). Jusqu'à présent, cela fonctionne pour moi, j'espère qu'il n'y a pas d'autres problèmes résultant de la solution de contournement que j'aurais peut-être oublié. Il suffit de modifier la fonction Notez que getdroles () code> de l'utilisateur comme celle-là: $ rôle-> getrole () code> retourne le nom du rôle comme une chaîne (par exemple, rôle_admin code>). p> p>
Cool de la solution de contournement. Je l'ai testé et ça marche! Merci @michaelb
Merci. Cela me rendait fou!
solution de ce problème est très simple.
Tous les problèmes associés aux références circulaires au vôtre Regardez Comment vous pouvez voir, symfony les rôles de votre utilisateur en appelant Vous devez implémenter Utilisateur code> et Rôle code> objets.
Vous avez donc pas serialize utilisateur :: rôles $ code> et Rôle :: utilisateurs $ code> champs. Symfony \ Component \ Security \ Core \ authentification \ Token \ AbstractToken :: __ construct () code> et Symfony \ Component \ Security \ Core \ Authentication \ Token \ AbstractToken :: serialize () code>. p> InterfaceUtilisateur :: getRoles () code> avant la sérialisation. Et serialize Utilisateur code> et Rôles code> séparément. P> \ Serializable Interface code> Utilisateur code > et Rôle code> entités p> Exemple:. h2>
/**
* Acme\Bundle\UserBundle\Entity\Role
*
* @ORM\Table(name="role")
* @ORM\Entity
*
*/
class Role implements RoleInterface, \Serializable
{
/**
* @var integer $id
*
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string $role
*
* @ORM\Column(name="role", type="string", length=20, unique=true)
*/
private $role;
/**
* Users in group (Inverse Side)
*
* @var ArrayCollection
*
* @ORM\ManyToMany(targetEntity="User", mappedBy="roles")
*/
private $users;
// .....
/**
* @see \Serializable::serialize()
*/
public function serialize()
{
/*
* ! Don't serialize $users field !
*/
return \serialize(array(
$this->id,
$this->role
));
}
/**
* @see \Serializable::unserialize()
*/
public function unserialize($serialized)
{
list(
$this->id,
$this->role
) = \unserialize($serialized);
}
}
Pour une raison quelconque, cela ne fonctionne pas avec moi. Symfony2.1.3 & PHP 5.4.9. Je me connecte avec succès, mais je reçois une exception dans les journaux [2012-12-17 17:19:26] Security.info: une exception d'authentification s'est produite; Redirection du point d'entrée d'authentification (un jeton n'a pas été trouvé dans le SecurityContext.) [] [] code> et je suis signalé à la page de connexion.
Recherchez des erreurs dans votre code. Ou montre-moi le code de sécurité.yml code> et le modèle utilisateur. Je vais essayer d'aider.
Je crois que cette solution est correcte. Voir Discus sur le GitHub: Github.com/symfony/symfony/issues/3691# Issuecomment-9831914
Array_Map appelle cette fonction pour tous les éléments renvoyés par GetTokens. Êtes-vous sûr que tous sont des objets ROL?