Unerwarteter Laravel-Fehler “Klassenbenutzer enthält 3 abstrakte Methoden …”

Lesezeit: 6 Minuten

Benutzer-Avatar
Thanos Paravantis

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

Fehler:

Die Klasse User enthält 3 abstrakte Methoden und muss daher abstrakt deklariert werden oder die restlichen 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.');
}
}

  • Welche Version von Laravel verwendest du?

    – Sam

    15. April 2014 um 21:12 Uhr

  • Prüfen RemindableInterface.php und UserInterface.php um sicherzustellen, dass Sie alle Methoden in Ihrer Klasse berücksichtigt haben. Sie sollten alle so vorhanden sein, wie sie sind, es sei denn, Sie haben sie überhaupt geändert.

    – Benutzer1669496

    15. April 2014 um 21:23 Uhr

  • Hab gerade bei laravel.com nachgeschaut. Befolgen Sie diese Anweisungen für Upgrade-Anweisungen laravel.com/docs/upgrade#upgrade-4.1.26

    – Benutzer1669496

    15. April 2014 um 21:31 Uhr

  • @ 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

    15. April 2014 um 21:33 Uhr


  • @Sam Soweit ich mich erinnern kann, habe ich die neueste Composer-Version, also die neueste Laravel 4-Installation.

    – Thanos Paravantis

    15. April 2014 um 21:40 Uhr

Ah gefunden.

Sein anscheinend dokumentiertes Laravel-Update.

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

„Fügen Sie zuerst 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';
}

Sehen http://laravel.com/docs/upgrade für weitere Details.

  • 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 begannen meine Tests fehlzuschlagen. Hat mir einen riesigen Schrecken eingejagt!

    – alexleonard

    16. April 2014 um 12:12 Uhr

  • Der einzige Nachteil beim Abrufen von Updates für den Laravel-Kern mit Composer ist, dass Sie keine Update-Hinweise lesen können. Trotzdem ist Composer verdammt großartig! Ich würde es nicht dafür eintauschen, Dateien hin und her zu schleppen.

    – racl101

    16. April 2014 um 15:49 Uhr

  • Wenn Sie eine haben würden UserSeeder mit dem Remember_token würde es jetzt alle Sessions ungültig machen und alle müssten sich neu einloggen?

    – James

    17. April 2014 um 8:32 Uhr

  • Lebensretter, nervte mich, warum mein Login nicht mehr funktionierte.

    – Emann

    21. April 2014 um 14:09 Uhr

  • Eine bahnbrechende Änderung in einem Patch-Release? Das ist lächerlich, ich sperre die genaue Version in meinem Composer vorerst ein. Danke, dass du die Antwort gefunden hast!

    – Simon Kjellberg

    6. Mai 2014 um 17:13 Uhr

Benutzer-Avatar
Sam

Ich bin kein Profi in der Umsetzung PHP-Schnittstellenaber ich glaube, Sie müssen alle Methoden von einbeziehen UserInterface und RemindableInterface in deiner User Klasse (da sie sie implementiert). Ansonsten ist die Klasse “abstrakt” und müssen 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 die Definition von Methoden wie enthalten getRow(), insertRow(), deleteRow(), updateColumn()usw. Dann können Sie diese Schnittstelle verwenden, um mehrere verschiedene Klassen für verschiedene Datenbanktypen (MySQL, PostgreSQL, Redis) zu erstellen, aber sie müssen alle den Regeln der Schnittstelle folgen. Dies erleichtert die Migration, da Sie wissen, egal welchen Datenbanktreiber Sie verwenden, um Daten aus einer Tabelle abzurufen, er implementiert immer die gleichen Methoden, die in Ihrer Schnittstelle definiert sind (mit anderen Worten, er abstrahiert die datenbankspezifische Logik von der Klasse).

3 mögliche Lösungen 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 am besten für Sie, da Ihre Klasse nicht alle Methoden von implementiert UserInterface und RemindableInterface warum sollten Sie sagen, dass es das tut.

  • Sie haben Recht, aber er implementiert sie alle, soweit ich sehen kann … Zumindest wenn er die aktuelle Laravel-Version verwendet.

    – Marcel Gwerder

    15. April 2014 um 21:11 Uhr


  • Hm, ich habe gerade die gleichen Probleme bekommen, nachdem ich ein (lokal) funktionierendes Projekt vom Repo auf den Server gezogen und ein neues Composer-Update durchgeführt habe.

    – Matija Milkovic

    15. April 2014 um 21:28 Uhr

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 bestehenden “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';
}

Ich habe den Fehler durch Hinzufügen behoben UserTrait zu User.php. Holen Sie sich das Original User.php Datei hier. Wenn Sie die nicht brauchen rememberMe Zeug, du brauchst nur das:

<?php

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

class User extends Eloquent implements UserInterface {

    use UserTrait;


}

Benutzer-Avatar
Ironheartbj18

„Fügen Sie zuerst ein neues, nullfähiges Remember_token von VARCHAR(100), TEXT oder einem Äquivalent zu Ihrer Benutzertabelle hinzu, das so eingefügt wird $table->text('remember_token', 100)->nullable(); in die tabelle dann php artisan migrieren. und aktualisieren Sie auch auf Ihr Elq-Modell.

Benutzer-Avatar
Thor

Die Klasse User enthält 6 abstrakte Methoden und muss daher als abstrakt deklariert werden oder die restlichen Methoden implementieren

(Illuminate\Auth\UserInterface::getAuthIdentifier,

Illuminate\Auth\UserInterface::getAuthPassword,

Illuminate\Auth\UserInterface::getRememberToken, …)

Benutzer-Avatar
H. Pauwelyn

Die Klasse User enthält 6 abstrakte Methoden und muss daher als abstrakt deklariert werden oder die restlichen 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 (es funktioniert für mich)

use Authenticatable, CanResetPassword;

Quelle: GitHub

1344700cookie-checkUnerwarteter Laravel-Fehler “Klassenbenutzer enthält 3 abstrakte Methoden …”

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy