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


74

在Laravel上对我的身份验证应用程序进行编程时,遇到了一个从未见过的错误。我已经为这个问题的原因进行了近一个小时的集思广益,但是我找不到解决方案。

错误:

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

您正在使用哪个版本的Laravel?
山姆

检查RemindableInterface.phpUserInterface.php确保您已考虑了类中的所有方法。除非您完全修改了它们,否则它们都应该保持原样。
user1669496

4
刚刚检查了laravel.com。遵循以下指示获取升级说明laravel.com/docs/upgrade#upgrade-4.1.26
user1669496 2014年

@ user3158900这应该是一个答案,因为它肯定会解决问题。不要忘了在链接之外添加解决方案的简短摘要。
Marcel Gwerder 2014年

1
@Sam据我所知,我拥有最新的Composer版本,最新的laravel 4安装。
Thanos Paravantis 2014年

Answers:


173

啊找到了。

它显然记录在案的Laravel更新。

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

“首先,添加一个新的,可为null的VARCHAR(100),TEXT或等同于您的users表的牢记令牌。

接下来,如果您使用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


1
谢谢谢谢!在其他开发人员完成了完全不应该影响我的代码的工作之后,我才停下来,突然我的测试开始失败。给了我一个巨大的恐惧!
alexleonard 2014年

关于使用Composer获取Laravel核心更新的一个缺点是您不会阅读更新说明。Still Composer真是太棒了!我不会用它来回交换文件。
racl101 2014年

如果您要UserSeeder使用牢记令牌,那么它将使所有会话无效,并且每个人都必须再次登录?
2014年

救生员,在烦我为什么我的登录停止工作。
Eddie 2014年

3
修补程序版本中的重大更改?这太荒谬了,我现在正在我的作曲家中锁定确切的版本。感谢您找到答案!
西蒙·凯贝格

4

我不是在实施亲PHP接口,但我相信你需要包括的所有方法UserInterface,并RemindableInterface在你的User类(因为它实现了它们)。否则,该类是“抽象的”,必须这样定义。

据我所知,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为什么还要说呢?


1
您是正确的,但据我所知,他实现了所有这些……至少,如果他使用了当前的Laravel版本。
Marcel Gwerder 2014年

嗯,在将可在本地工作的项目从存储库中拉到服务器并进行新的作曲者更新后,遇到了同样的问题。
MatijaMilković2014年

2

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

注意:此更改将使所有现有的“记住我”会话无效,因此所有用户将被迫重新验证您的应用程序。

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

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

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

0

我通过增加固定的错误UserTraitUser.php。在此处获取原始User.php文件。如果您不需要这些东西,则只需要这样做:rememberMe

<?php

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

class User extends Eloquent implements UserInterface {

    use UserTrait;


}

0

“首先,为您的用户表添加一个新的,可为null的VARCHAR(100),TEXT或等效表。记住此$table->text('remember_token', 100)->nullable();令牌后,将其放入表中,然后php artisan进行迁移。同时也更新到您的Elq模型。


0

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

(Illuminate \ Auth \ UserInterface :: getAuthIdentifier,

Illuminate \ Auth \ UserInterface :: getAuthPassword,

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


0

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

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

解决方案:您将此代码添加到User类中(对我有用)

use Authenticatable, CanResetPassword;

资料来源:GitHub


-1

我也收到此错误。然后我添加了:

getRememberToken()
setRememberToken($value)
getRememberTokenName()

代码工作后在这里

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.