Laravel непредвиденная ошибка "пользователь класса содержит 3 абстрактных метода..."

При программировании моего приложения аутентификации на 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 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.');
}
}

Ответ 1

А нашел его.

Это, по-видимому, документальное обновление Laravel.

Вы можете проверить документы Laravel, чтобы исправить свои проблемы:

"Сначала добавьте новый, nullable remember_token из VARCHAR (100), TEXT или эквивалент вашей таблицы пользователей.

Затем, если вы используете драйвер проверки подлинности 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.

Ответ 2

Я не профессионал в реализации PHP-интерфейсов, но я считаю, что вам нужно включить все методы UserInterface и RemindableInterface в вашем классе User (поскольку он реализует их). В противном случае класс "abstract" и должен быть определен как таковой.

По моим сведениям, 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, зачем вам это нужно.

Ответ 3

Это проблема с обновлением. Laravel заставляет нас обновить модель User.php следующим кодом, чтобы исправить эту проблему.

Примечание. Все существующие сеансы "помнить меня" будут признаны недействительными изменение, поэтому все пользователи будут вынуждены повторно аутентифицироваться приложение.

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

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

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

Ответ 4

Я исправил ошибку, добавив UserTrait в User.php. Получите исходный User.php файл здесь. Если вам не нужен материал rememberMe, вам просто нужно:

<?php

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

class User extends Eloquent implements UserInterface {

    use UserTrait;


}

Ответ 5

"Сначала добавьте новый, nullable remember_token из VARCHAR (100), ТЕКСТ или эквивалент вашей таблицы пользователей, который помещается как этот $table->text('remember_token', 100)->nullable(); в таблицу, а затем php artisan migrate и обновляется до вашей модели Elq.

Ответ 6

Пользователь класса содержит 6 абстрактных методов и поэтому должен быть объявлен абстрактным или реализовать оставшиеся методы

(Illuminate\Auth\UserInterface:: getAuthIdentifier,

Illuminate\Auth\UserInterface:: getAuthPassword,

Осветите\Auth \:: getRememberToken пользовательского интерфейса, ...)

Ответ 7

Пользователь класса содержит 6 абстрактных методов и поэтому должен быть объявлен абстрактным или реализовать оставшиеся методы

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

Решение: Вы добавляете этот код в класс User (он работает для меня)

use Authenticatable, CanResetPassword;

Источник: GitHub

Ответ 8

Я также получаю эту ошибку. Затем я добавил:

getRememberToken()
setRememberToken($value)
getRememberTokenName()

здесь после работы кода