在Laravel上编程身份验证应用程序时,我遇到了一个以前从未见过的错误。为了找出这个问题的原因,我已经集思广益了将近一个小时,但还是找不到解决办法。
错误:
类User包含3个抽象方法,因此必须声明为抽象方法或实现其余方法(Illuminate''Auth''UserInterface::getRememberToken,Illuminate''Auth''UserInterface=:setRememberToken,Illumination''Auth''UserInterface::getRemember TokenName)
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.');
}
}
阿找到了。
它显然记录了Laravel更新。
你可以查看Laravel文档来解决你的问题:
"首先,将VARCHAR(100)、TEXT或等效项的新的、可为null的remember_token添加到用户表中。
接下来,如果您使用Eloquent身份验证驱动程序,请使用以下三种方法更新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
类中包含UserInterface
和RemindableInterface
的所有方法(因为它实现了它们)。否则,类是"抽象的",必须这样定义。
据我所知,PHP接口是一组类必须遵循的准则。例如,您可以为特定的数据库表提供一个通用接口。它将包括getRow()
、insertRow()
、deleteRow()
、updateColumn()
等方法的定义。然后你可以使用这个接口为不同的数据库类型(MySQL、PostgreSQL、Redis)创建多个不同的类,但它们都必须遵循接口的规则。这使得迁移更加容易,因为无论使用哪个数据库驱动程序从表中检索数据,它都将始终实现接口中定义的相同方法(换句话说,从类中抽象出特定于数据库的逻辑)。
据我所知,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最适合您,因为如果您的类没有实现UserInterface
和RemindableInterface
中的所有方法,为什么您需要说它实现了呢。
这是一个更新问题。Laravel强迫我们用以下代码更新User.php模型来解决这个问题。
注意:所有现有的"记住我"会话都将因此而无效更改,因此所有用户都将被迫使用您的应用
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;
}
"首先,向用户表中添加一个新的、可为null的VARCHAR(100)、TEXT或等效的remember_token。它像这样放入$table->text('remember_token', 100)->nullable();
中,然后php手工迁移。并更新到您的Elq模型。
class User包含6个抽象方法,因此必须声明为抽象方法或实现其余方法
(Illuminate''Auth''UserInterface::getAuthIdentifier,
Illuminate''Auth''UserInterface::getAuthPassword,
Illuminate''Auth''UserInterface::getRememberToken,…)
class User包含6个抽象方法,因此必须声明为抽象方法或实现其余方法
(Illuminate'Auth'UserInterface::getAuthIdentifier,
Illuminate'Auth'UserInterface::getAuthPassword,
Illuminate'Auth'UserInterface::getRememberToken,
...
)
解决方案:您在User类中添加此代码(它对我有效)
use Authenticatable, CanResetPassword;
来源:GitHub
我也收到了这个错误。然后我添加了:
getRememberToken()
setRememberToken($value)
getRememberTokenName()
代码工作后的此处