Laravel unerwarteter Fehler "Klassenbenutzer enthält 3 abstrakte Methoden ..."

74

Beim Programmieren meiner Authentifizierungs-App auf Laravel bin ich auf einen Fehler gestoßen, den ich noch nie gesehen habe. Ich habe fast eine Stunde lang über die Ursache dieses Problems nachgedacht, aber ich kann noch keine Lösung finden.

Error:

Der Klassenbenutzer enthält 3 abstrakte Methoden und muss daher als abstrakt deklariert werden oder die verbleibenden Methoden implementieren (Illuminate \ Auth \ UserInterface :: getRememberToken, Illuminate \ Auth \ UserInterface :: setRememberToken, Illuminate \ Auth \ UserInterface :: getRememberTokenName).

User.php Modell:

<?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;
}

}

Und die 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.');
}
}
Thanos Paravantis
quelle
Welche Version von Laravel verwenden Sie?
Sam
Überprüfen RemindableInterface.phpund UserInterface.phpsicher sein , dass Sie für alle Methoden in Ihrer Klasse berücksichtigt haben. Sie sollten alle so sein, wie sie sind, es sei denn, Sie haben sie überhaupt geändert.
user1669496
4
Habe gerade laravel.com überprüft. Befolgen Sie diese Anweisungen für Upgrade-Anweisungen laravel.com/docs/upgrade#upgrade-4.1.26
user1669496
@ user3158900 Dies sollte eine Antwort sein, da es das Problem definitiv lösen wird. Vergessen Sie nicht, zusätzlich zum Link eine kurze Zusammenfassung der Lösung hinzuzufügen.
Marcel Gwerder
1
@Sam Soweit ich mich erinnern kann, habe ich die neueste Composer-Version, die neueste Laravel 4-Installation.
Thanos Paravantis

Antworten:

173

Ich habe es gefunden.

Es ist anscheinend Laravel Update dokumentiert.

Sie können die Laravel-Dokumente überprüfen, um Ihre Probleme zu beheben:

"Fügen Sie zunächst ein neues, nullfähiges Remember_token von VARCHAR (100), TEXT oder einem Äquivalent zu Ihrer Benutzertabelle hinzu.

Wenn Sie den Eloquent-Authentifizierungstreiber verwenden, aktualisieren Sie als Nächstes Ihre Benutzerklasse mit den folgenden drei Methoden:

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

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

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

""

Weitere Informationen finden Sie unter http://laravel.com/docs/upgrade .

Matija Milković
quelle
1
Danke Danke! Ich hatte gerade gezogen, nachdem der andere Entwickler Dinge getan hatte, die meinen Code überhaupt nicht hätten beeinflussen sollen, und plötzlich scheiterten meine Tests. Hat mich sehr erschreckt!
Alexanderle
Der einzige Nachteil beim Abrufen von Updates für den Laravel-Kern mit Composer besteht darin, dass Sie keine Update-Notizen lesen können. Trotzdem ist Composer verdammt großartig! Ich würde es nicht gegen das Hin- und Herschleppen von Dateien eintauschen.
racl101
Wenn Sie eine UserSeedermit dem Remember_Token haben würden, würde dies jetzt alle Sitzungen ungültig machen und jeder müsste sich erneut anmelden?
James
Lebensretter, nervte mich, warum mein Login nicht mehr funktionierte.
Eman
3
Eine bahnbrechende Änderung in einer Patch-Version? Das ist lächerlich, ich sperre vorerst die genaue Version in meinem Komponisten. Vielen Dank, dass Sie die Antwort gefunden haben!
Simon Kjellberg
4

Ich bin kein Profi bei der Implementierung von PHP-Schnittstellen , aber ich glaube, Sie müssen alle Methoden von UserInterfaceund RemindableInterfacein Ihre UserKlasse aufnehmen (da sie implementiert werden). Andernfalls ist die Klasse "abstrakt" und muss als solche definiert werden.

Meines Wissens ist eine PHP-Schnittstelle eine Reihe von Richtlinien, denen eine Klasse folgen muss. Beispielsweise können Sie eine allgemeine Schnittstelle für eine bestimmte Datenbanktabelle haben. Es würde auch Definition von Methoden wie getRow(), insertRow(), deleteRow(), updateColumn(), etc. Dann Sie diese Schnittstelle verwenden , können mehrere verschiedene Klassen für verschiedene Datenbanktypen (MySQL, PostgreSQL, Redis), aber sie müssen alle folgen den Regeln der Schnittstelle zu machen. Dies erleichtert die Migration, da Sie unabhängig davon, mit welchem ​​Datenbanktreiber Sie Daten aus einer Tabelle abrufen, immer dieselben Methoden implementieren, die in Ihrer Schnittstelle definiert sind (dh die datenbankspezifische Logik von der Klasse abstrahieren).

3 mögliche Korrekturen, soweit ich weiß:

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
}

Ich denke, # 2 ist das Beste für Sie, denn wenn Ihre Klasse nicht alle Methoden implementiert UserInterfaceund RemindableInterfacewarum sollten Sie sagen müssen, dass dies der Fall ist.

Sam
quelle
1
Sie haben Recht, aber er implementiert sie alle, soweit ich sehen kann ... Zumindest wenn er die aktuelle Laravel-Version verwendet.
Marcel Gwerder
Hm, ich habe gerade die gleichen Probleme, nachdem ich das (lokal) funktionierende Projekt vom Repo auf den Server gezogen und ein neues Composer-Update durchgeführt habe.
Matija Milković
2

Dies ist ein Update-Problem. Laravel zwingt uns, das User.php-Modell mit dem folgenden Code zu aktualisieren, um dieses Problem zu beheben.

Hinweis: Alle vorhandenen "Remember Me" -Sitzungen werden durch diese Änderung ungültig, sodass alle Benutzer gezwungen sind, sich erneut bei Ihrer Anwendung zu authentifizieren.

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

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

public function getRememberTokenName()
{
    return 'remember_token';
}
Bastin Robin
quelle
0

Ich habe den Fehler durch Hinzufügen UserTraitzu behoben User.php. Holen Sie sich die Original - User.phpDatei hier . Wenn Sie das rememberMeZeug nicht brauchen , brauchen Sie nur Folgendes:

<?php

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

class User extends Eloquent implements UserInterface {

    use UserTrait;


}
sqren
quelle
0

"Fügen Sie zuerst ein neues, nullfähiges Remember_token von VARCHAR (100), TEXT oder ein Äquivalent zu Ihrer Benutzertabelle hinzu. Dieses wird $table->text('remember_token', 100)->nullable();in die Tabelle eingefügt und dann von PHP Artisan migriert. Und aktualisieren Sie es auch auf Ihr Elq-Modell.

Ironheartbj18
quelle
0

Der Klassenbenutzer enthält 6 abstrakte Methoden und muss daher als abstrakt deklariert werden oder die verbleibenden Methoden implementieren

(Illuminate \ Auth \ UserInterface :: getAuthIdentifier,

Illuminate \ Auth \ UserInterface :: getAuthPassword,

Illuminate \ Auth \ UserInterface :: getRememberToken, ...)

Luiggi
quelle
0

Der Klassenbenutzer enthält 6 abstrakte Methoden und muss daher als abstrakt deklariert werden oder die verbleibenden Methoden implementieren

(Illuminate\Auth\UserInterface::getAuthIdentifier, 
 Illuminate\Auth\UserInterface::getAuthPassword, 
 Illuminate\Auth\UserInterface::getRememberToken, 
 ...
)

Lösung: Sie fügen diesen Code in der Benutzerklasse hinzu (er funktioniert bei mir).

use Authenticatable, CanResetPassword;

Quelle: GitHub

Fabien Munoz
quelle
-1

Ich bekomme auch diesen Fehler. Dann habe ich hinzugefügt:

getRememberToken()
setRememberToken($value)
getRememberTokenName()

hier, nachdem der Code funktioniert

Rocketz
quelle