72 votes

Laravel erreur inattendue "de la classe de l'utilisateur contient des 3 méthodes abstraites..."

Alors que la programmation de mon Authentification de l'application sur Laravel, je peux à travers à une erreur, je n'ai jamais vu avant. J'ai été remue-méninges pendant près d'une heure pour la cause de ce problème, mais pourtant je ne peux pas trouver une solution.

Erreur:

La classe de l'Utilisateur contient des 3 méthodes abstraites et doit donc être déclarée abstract ou mettre en œuvre les autres méthodes (Éclairer\Auth\UserInterface::getRememberToken, d'Éclairer\Auth\UserInterface::setRememberToken, d'Éclairer\Auth\UserInterface::getRememberTokenName)

User.php Modèle:

<?php

use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;

class User extends Eloquent implements UserInterface, RemindableInterface {

protected $fillable = [
    "email",
    "username",
    "password",
    "password_temp",
    "code",
    "active",
    "created_at",
    "updated_at",
    "banned"
];

/**
 * The database table used by the model.
 *
 * @var string
 */
protected $table = 'users';

/**
 * The attributes excluded from the model's JSON form.
 *
 * @var array
 */
protected $hidden = array('password');

/**
 * Get the unique identifier for the user.
 *
 * @return mixed
 */
public function getAuthIdentifier()
{
    return $this->getKey();
}

/**
 * Get the password for the user.
 *
 * @return string
 */
public function getAuthPassword()
{
    return $this->password;
}

/**
 * Get the e-mail address where password reminders are sent.
 *
 * @return string
 */
public function getReminderEmail()
{
    return $this->email;
}

}

Et la RegisterController.php

<?php

class RegisterController extends BaseController {

public function getRegister()
{
    return View::make('template.home.register');
}

public function postRegister()
{
    $rules = [
        "email"         => "required|email|max:50|unique:users",
        "username"      => "required|max:50|min:5|unique:users",
        "password"      => "required|max:50|min:6",
        "password_again"=> "required|same:password",
    ];

    $messages = ["required" => "This field is required." ];

    $validator = Validator::make(Input::all(), $rules, $messages);

    if($validator->fails())
    {
        return Redirect::route('register')->withErrors($validator)->withInput();
    } else {
        $email      = Input::get('email');
        $username   = Input::get('username');
        $password   = Input::get('password');
        $code       = str_random(60);

        $user = User::create([
            'email'         => $email,
            'username'      => $username,
            'password'      => Hash::make($password),
            'code'          => $code,
            'activated'     => 0,
            'banned'        => 0
        ]);

        if ($user)
        {
            Mail::send('template.email.activate', ['link' => URL::route('activate', $code), 'username' => $username], function($message) use ($user)
            {
                $message->to($user->email, $user->username)->subject('Account Registration');
            });

            return Redirect::route('register')->with('homeError', 'There was a problem creating your account.');
        }
    }
    return Redirect::route('register')->with('homeError', 'Account could not be created.');
}
}

Votre aide est très appréciée.

173voto

Matija Milković Points 1756

Ah trouvé.

Son apparemment documenté Laravel mise à Jour.

Vous pouvez le vérifier Laravel docs pour résoudre vos problèmes:

"Tout d'abord, ajoutez un nouveau, nullable remember_token de type VARCHAR(100), le TEXTE, ou l'équivalent de votre table des utilisateurs.

Ensuite, si vous utilisez l'Éloquent authentification pilote, mettre à jour votre classe d'Utilisateur avec les trois méthodes suivantes:

public function getRememberToken()
{
    return $this->remember_token;
}

public function setRememberToken($value)
{
    $this->remember_token = $value;
}

public function getRememberTokenName()
{
    return 'remember_token';
}

"

Voir http://laravel.com/docs/upgrade pour plus de détails.

4voto

Sam Points 10405

Je ne suis pas un pro de la mise en œuvre de PHP Interfaces, mais je crois que vous devez inclure toutes les méthodes d' UserInterface et RemindableInterface votre User classe (puisqu'il les met en œuvre). Sinon, la classe est "abstrait" et doit être définie en tant que telle.

Par mes connaissances, une interface PHP est un ensemble de lignes directrices qu'une classe doit suivre. Par exemple, vous pouvez avoir une interface générale pour une table de base de données. Il faudrait inclure la définition de méthodes comme l' getRow(), insertRow(), deleteRow(), updateColumn(), etc. Ensuite, vous pouvez utiliser cette interface pour faire plusieurs classes différentes pour les différents types de base de données (MySQL, PostgreSQL, Redis), mais ils doivent suivre les règles de l'interface. Cela rend la migration plus facile, puisque vous savez que peu importe le pilote de base de données que vous utilisez pour récupérer des données à partir d'un tableau, il sera toujours de mettre en œuvre les mêmes méthodes définies dans l'interface (en d'autres termes, en faisant abstraction de la base de données logique spécifique de la classe).

3 solutions possibles, pour autant que je sais:

abstract class User extends Eloquent implements UserInterface, RemindableInterface
{
}

class User extends Eloquent
{
}

class User extends Eloquent implements UserInterface, RemindableInterface
{
     // include all methods from UserInterFace and RemindableInterface
}

Je pense que #2 est le mieux pour vous, car si votre classe n'implémente pas toutes les méthodes de UserInterface et RemindableInterface pourquoi auriez-vous besoin de dire qu'il fait.

2voto

Bastin Robin Points 101

C'est un problème de mise à jour. Laravel nous forcer à mettre à jour le User.php modèle avec le code suivant pour résoudre ce problème.

Note: Tous les "remember me" sessions seront invalidées par cette changement, de sorte que tous les utilisateurs seront obligés de se ré-authentifier avec votre application.

public function getRememberToken()
{
    return $this->remember_token;   
}

public function setRememberToken($value)
{
    $this->remember_token = $value;
} 

public function getRememberTokenName()
{
    return 'remember_token';
}

0voto

sqren Points 981

J'ai corrigé l'erreur en ajoutant UserTrait de User.php. D'obtenir l'original User.php le fichier ici. Si vous n'avez pas besoin de l' rememberMe trucs, vous avez juste besoin de ceci:

<?php

use Illuminate\Auth\UserTrait;
use Illuminate\Auth\UserInterface;

class User extends Eloquent implements UserInterface {

    use UserTrait;


}

-1voto

rocketz Points 1

J'ai aussi cette erreur.puis j'ai ajouté:

getRememberToken()
setRememberToken($value)
getRememberTokenName()

ci-après code de travail

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X