11
votes

FeLockterface jette "appeler sur une erreur de non-objet"

Je travaille sur Symfony 2.0.16

J'ai dans mon utilisateurProvider la méthode getroles xxx

et mon entité ROL a l'interface de rôle xxx

mais quand j'essaie de vous connecter, je reçois l'erreur suivante

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

lecture de la classe SecurityDatacollecteur, l'erreur est lancée par une fermeture xxx

maintenant je change ceci en xxx

à ma surprise, $ rôle est un objet rol mais Je ne comprends pas pourquoi je reçois l'erreur.


1 commentaires

Array_Map appelle cette fonction pour tous les éléments renvoyés par GetTokens. Êtes-vous sûr que tous sont des objets ROL?


3 Réponses :


14
votes

J'ai trouvé la solution que le problème est un bug dans php 5.4 strong> (le PHP que j'utilise) Méthode Serialize forte> L'utilisateur GITUB Yoannch a proposé ceci Solution , écrase les méthodes 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);
}


5 commentaires

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?



11
votes

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 getdroles () de l'utilisateur comme celle-là: xxx

Notez que $ rôle-> getrole () retourne le nom du rôle comme une chaîne (par exemple, rôle_admin ).


2 commentaires

Cool de la solution de contournement. Je l'ai testé et ça marche! Merci @michaelb


Merci. Cela me rendait fou!



6
votes

solution de ce problème est très simple. Tous les problèmes associés aux références circulaires au vôtre Utilisateur code> et Rôle code> objets. Vous avez donc pas serialize utilisateur :: rôles $ code> et Rôle :: utilisateurs $ code> champs.

Regardez Symfony \ Component \ Security \ Core \ authentification \ Token \ AbstractToken :: __ construct () code> et Symfony \ Component \ Security \ Core \ Authentication \ Token \ AbstractToken :: serialize () code>. p>

Comment vous pouvez voir, symfony les rôles de votre utilisateur en appelant InterfaceUtilisateur :: getRoles () code> avant la sérialisation. Et serialize Utilisateur code> et Rôles code> séparément. P>

Vous devez implémenter \ 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);
    }
}