Laravel意外错误"类用户包含3种抽象方法......"

时间:2014-04-15 20:56:47

标签: php laravel

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

错误:

  

类用户包含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.');
}
}

8 个答案:

答案 0 :(得分:173)

啊找到了它。

它显然是Laravel Update的记录。

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

&#34;首先,在您的users表中添加一个新的,可空的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';
}

&#34;

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

答案 1 :(得分:4)

我不是专家来实施PHP Interfaces,但我相信您需要在UserInterface课程中包含RemindableInterfaceUser的所有方法(因为它实现了它们)。否则,该类为"abstract",必须如此定义。

据我所知,PHP接口是一组必须遵循的指南。例如,您可以拥有特定数据库表的通用接口。它将包括getRow()insertRow()deleteRow()updateColumn()等方法的定义。然后,您可以使用此接口为不同的数据库类型创建多个不同的类(MySQL ,PostgreSQL,Redis),但他们都必须遵循界面的规则。这使迁移变得更容易,因为您知道无论使用哪个数据库驱动程序从表中检索数据,它都将始终实现接口中定义的相同方法(换句话说,从类中抽象出特定于数据库的逻辑)。 / p>

据我所知,有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中的所有方法,您为什么要说它呢?

答案 2 :(得分:2)

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

  

注意:所有现有的&#34;记住我&#34;会话将因此而失效   更改,因此所有用户都将被迫重新进行身份验证   应用

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

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

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

答案 3 :(得分:0)

我通过将UserTrait添加到User.php来修正错误。获取原始User.php文件here。 如果您不需要rememberMe内容,则只需要:

<?php

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

class User extends Eloquent implements UserInterface {

    use UserTrait;


}

答案 4 :(得分:0)

“首先,将一个新的,可空的VARCHAR(100),TEXT或者等效的remember_token添加到你的用户表中。这就像这个$table->text('remember_token', 100)->nullable();一样放入表中然后php artisan migrate。并更新到你的Elq模特也是。

答案 5 :(得分:0)

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

(Illuminate \ Auth \ UserInterface :: getAuthIdentifier,

Illuminate \ Auth \ UserInterface :: getAuthPassword,

照亮\验证\的UserInterface :: getRememberToken, ...)

答案 6 :(得分:0)

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

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

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

use Authenticatable, CanResetPassword;

来源:GitHub

答案 7 :(得分:-1)

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

getRememberToken()
setRememberToken($value)
getRememberTokenName()
代码工作后