2014-04-15 1 views
71

Beim Programmieren meiner Authentifizierungs-App auf Laravel stieß ich auf einen Fehler, den ich noch nie zuvor gesehen hatte. Ich habe fast eine Stunde wegen der Ursache dieses Problems brainstormiert, aber ich kann keine Lösung finden.Laravel unerwarteter Fehler "Klassenbenutzer enthält 3 abstrakte Methoden ..."

Fehler:

Class User contains 3 abstract methods and must therefore be declared abstract or implement the remaining methods (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.'); 
} 
} 
+0

Welche Version von Laravel verwenden Sie? – Sam

+0

Überprüfen Sie 'RemindableInterface.php' und' UserInterface.php', um sicherzustellen, dass Sie alle Methoden in Ihrer Klasse berücksichtigt haben. Sie sollten alle so sein, wie sie sind, es sei denn, du hast sie verändert. – user3158900

+4

Nur überprüft laravel.com. Befolgen Sie diese Anweisungen für Upgrade-Anweisungen http://laravel.com/docs/upgrade#upgrade-4.1.26 – user3158900

Antwort

173

Ah hat es gefunden.

Seine offenbar dokumentiert Laravel Update.

Sie können Laravel Dokumente überprüfen, um Ihre Probleme zu beheben.

„Zuerst fügen Sie eine neue, Nullable-remember_token von VARCHAR (100), Text oder gleichwertig Benutzer Tabelle

Als nächstes, wenn Sie den Eloquent Authentifizierungs-Treiber verwenden, Ihre Benutzerklasse mit den folgenden drei Methoden aktualisieren:

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

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

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

"

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

+1

Danke danke! Ich hatte gerade gezogen, nachdem der andere Entwickler Sachen gemacht hatte, die meinen Code überhaupt nicht beeinflusst haben sollten und plötzlich begannen meine Tests zu versagen. Gab mir einen riesigen Schreck! – alexleonard

+0

Es ist der einzige Nachteil, Updates für den Laravel-Kern mit Composer zu erhalten, da Sie keine Update-Notizen lesen können. Still Composer ist verdammt gut! Ich würde es nicht dafür tauschen, Dateien hin- und herzuschleppen. – racl101

+0

Wenn Sie einen 'UserSeeder' mit dem remember_token hätten, würde es jetzt alle Sitzungen ungültig machen und jeder müsste sich erneut anmelden? – James

4

Ich bin kein Profi PHP Interfaces bei der Umsetzung, aber ich glaube, Sie müssen alle Methoden von UserInterface und RemindableInterface in Ihrem einschließen User Klasse (seit es sie implementiert). Andernfalls lautet die Klasse "abstract" und muss als solche definiert werden.

Nach meinem Wissen ist eine PHP-Schnittstelle eine Reihe von Richtlinien, denen eine Klasse folgen muss. Zum Beispiel können Sie eine allgemeine Schnittstelle für eine bestimmte Datenbanktabelle haben. Es würde die Definition von Methoden wie getRow(), insertRow(), deleteRow(), updateColumn(), etc. enthalten. Dann können Sie diese Schnittstelle verwenden, um mehrere verschiedene Klassen für verschiedene Datenbanktypen (MySQL, PostgreSQL, Redis) zu erstellen, aber alle müssen den Regeln der Schnittstelle folgen . Dies erleichtert die Migration, da Sie wissen, dass unabhängig vom Datenbanktreiber, den Sie zum Abrufen von Daten aus einer Tabelle verwenden, immer die gleichen Methoden implementiert werden, die in Ihrer Schnittstelle definiert sind (dh die datenbankspezifische Logik von der Klasse abstrahiert).

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 am besten für Sie ist, da, wenn Ihre Klasse nicht implementiert alle Methoden von UserInterface und RemindableInterface warum würden Sie sagen müssen es tut.

+1

Du hast recht, aber er implementiert sie alle, soweit ich sehen kann ... Zumindest wenn er die aktuelle Laravel Version benutzt. –

+0

Interessant, tut er .. – Sam

+0

Hm, habe gerade die gleichen Probleme nach dem Ziehen Projekt, das (lokal) von Repo zu Server funktioniert und frischen Komponisten aktualisieren. –

2

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

Note: All existing "remember me" sessions will be invalidated by this change, so all users will be forced to re-authenticate with your application.

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

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

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

Ich habe auch diesen Fehler.i dann hinzugefügt:

getRememberToken() 
setRememberToken($value) 
getRememberTokenName() 

hier nach Code funktioniert

0

Ich reparierte den Fehler durch UserTrait-User.php hinzufügen. Holen Sie sich das Original User.php Datei here. Wenn Sie das rememberMe Zeug nicht brauchen, brauchen Sie nur das:

<?php 

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

class User extends Eloquent implements UserInterface { 

    use UserTrait; 


} 
0

„zunächst einen neuen, Nullable-remember_token von VARCHAR (100), Text oder äquivalent zu Ihrer Benutzer-Tabelle hinzufügen, die gestellt wird. wie diese $table->text('remember_token', 100)->nullable(); in die Tabelle php Handwerkers wandern dann. und Aktualisierung Ihrer ELQ Modell zu.

0

Klasse Benutzer enthält 6 abstrakte Methoden und daher abstrakt werden müssen oder erklärt implementieren die übrigen Methoden

(Illuminate \ Auth \ Userinterface :: getAuthIdentifier,

Illuminate \ Auth \ Userinterface :: getAuthPassword,

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

0

Klasse Benutzer enthält 6 abstrakte Methoden und deshalb abstrakt deklariert werden müssen, oder implementieren die restlichen Methoden

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

Lösung: Sie fügen Sie diesen Code in Benutzerklasse (es ist für mich arbeiten)

use Authenticatable, CanResetPassword; 

Quelle: GitHub