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

在 Laravel 上编写身份验证应用程序时,我遇到了一个以前从未见过的错误。我已经为这个问题的原因进行了将近一个小时的头脑风暴,但仍然找不到解决办法。

错误:

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

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.');
}
}
22997 次浏览

我不是实现 PHP 接口的专家,但是我相信你需要在你的 User类中包含 UserInterfaceRemindableInterface的所有方法(因为它实现了它们)。否则,该类是 “抽象”,并且必须定义为 “抽象”

据我所知,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最适合您,因为如果您的类没有实现来自 UserInterfaceRemindableInterface的所有方法,为什么您需要说它实现了。

找到了。

它显然记录了 Laravel 更新。

你可以查看 Laravel 文档来解决你的问题:

”首先,添加 VARCHAR (100)、 TEXT 或相当于用户表的新的、可为空的 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

这是一个更新问题。Laravel 强制我们用下面的代码更新 User.php 模型来修复这个问题。

注意: 所有现有的“ remember me”会话将因此而失效 更改,因此所有用户将被迫使用您的 申请。

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


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


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

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

getRememberToken()
setRememberToken($value)
getRememberTokenName()

在这里代码正常工作之后

我通过将 UserTrait添加到 User.php修复了这个错误。 如果你不需要 rememberMe的东西,你只需要这个:

<?php


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


class User extends Eloquent implements UserInterface {


use UserTrait;




}

”首先,添加 VARCHAR (100)、 TEXT 或相当于用户表的新的、可为空的 remember _ token。把这样的 $table->text('remember_token', 100)->nullable();放到表中,然后 php 工匠迁移。并更新到您的 Elq 模型。

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

(Illumination Auth UserInterface: : getAuthIdentifier,

照明 Auth 用户界面: : getAuthPassword,

照明 Auth 用户界面: : getRememberToken, ...)

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

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

解决方案: 在 User 类中添加这段代码(对我来说很有用)

use Authenticatable, CanResetPassword;

资料来源: GitHub