Laravel意外的错误“类用户包含3个抽象方法…”

当在Laravel上编写身份validation应用程序时,我遇到了一个我从未见过的错误。 我一直在为这个问题的原因集思广益近一个小时,但我找不到解决scheme。

错误:

类User包含3个抽象方法,因此必须声明为抽象或实现其余方法(Illuminate \ Auth \ UserInterface :: getRememberToken,Illuminate \ Auth \ UserInterface :: setRememberToken,Illuminate \ Auth \ UserInterface :: getRememberTokenName)

User.php模型:

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

和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.'); } } 

啊发现了。

它显然logging了Laravel更新。

您可以检查Laravel文档来解决您的问题:

首先,添加一个新的,可为空的VARCHAR(100),TEXT或与您的用户表等同的remember_token。

接下来,如果您使用Eloquent身份validation驱动程序,请使用以下三种方法更新您的User类:

 public function getRememberToken() { return $this->remember_token; } public function setRememberToken($value) { $this->remember_token = $value; } public function getRememberTokenName() { return 'remember_token'; } 

有关更多详细信息,请参阅http://laravel.com/docs/upgrade

我不是一个实现PHP接口的专业人士,但我相信你需要在User类中包含UserInterfaceRemindableInterface所有方法(因为它实现了它们)。 否则,这个类是“抽象的” ,必须被定义为这样。

据我所知,PHP接口是一类必须遵循的准则。 例如,您可以为特定的数据库表提供一个通用的接口。 它将包括诸如getRow()insertRow()deleteRow()updateColumn()等方法的定义。然后你可以使用这个接口为不同的数据库types(MySQL,PostgreSQL,Redis)创build多个不同的类,但是它们都必须遵循界面的规则。 这使得迁移变得更容易,因为无论您使用哪个数据库驱动程序从表中检索数据,它都将实现与您的界面中定义的相同的方法(换句话说,从类中抽象数据库特定的逻辑)。

据我所知,有3种可能的修复方法:

 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 } 

我认为#2对你来说是最好的,因为如果你的类没有实现UserInterfaceRemindableInterface所有方法,你为什么需要说呢。

这是一个更新问题。 Laravel迫使我们用下面的代码更新User.php模型来解决这个问题。

注意:所有现有的“记住我”会话都将因此次更改而失效,因此所有用户都将被强制重新进行身份validation。

 public function getRememberToken() { return $this->remember_token; } public function setRememberToken($value) { $this->remember_token = $value; } public function getRememberTokenName() { return 'remember_token'; } 

我通过添加UserTrait User.php修复了错误。 在这里获取原始的User.php文件。 如果你不需要rememberMe东西,你只需要这个:

 <?php use Illuminate\Auth\UserTrait; use Illuminate\Auth\UserInterface; class User extends Eloquent implements UserInterface { use UserTrait; } 

“首先,添加一个新的,可为空的记忆_token的VARCHAR(100),TEXT,或相当于您的用户表,这就像这个$table->text('remember_token', 100)->nullable();然后php工匠迁移,并更新到您的Elq模型。

类用户包含6个抽象方法,因此必须声明为抽象或实现其余的方法

(照亮\身份validation\的UserInterface :: getAuthIdentifier,

照亮\validation\的UserInterface :: getAuthPassword,

Illuminate \ Auth \ UserInterface :: getRememberToken,…)

类用户包含6个抽象方法,因此必须声明为抽象或实现其余的方法

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

解决scheme:在User类中添加这个代码(它对我有用)

 use Authenticatable, CanResetPassword; 

来源: GitHub

我也得到这个错误。然后我补充说:

 getRememberToken() setRememberToken($value) getRememberTokenName() 

这里代码正在工作之后