Несподівана помилка 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.phpі UserInterface.phpпереконайтеся, що ви врахували всі методи у своєму класі. Усі вони повинні бути там як є, якщо ви їх взагалі не модифікували.
user1669496

4
Щойно перевірив laravel.com. Дотримуйтесь цих вказівок, щоб отримати інструкції з оновлення laravel.com/docs/upgrade#upgrade-4.1.26
user1669496

@ user3158900 Це має бути відповіддю, оскільки це точно вирішить проблему. Не забудьте додати короткий підсумок рішення на додаток до посилання.
Марсель Гвердер,

1
@Sam Наскільки я пам'ятаю, я маю останню версію Composer, останню установку Laravel 4.
Танос Паравантіс,

Відповіді:


173

Ах знайшов.

Це, очевидно, задокументоване оновлення Laravel.

Ви можете перевірити документи Laravel, щоб вирішити свої проблеми:

"По-перше, додайте нову маркувальну пам'ять 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 .


1
Дякую дякую! Я щойно пішов після того, як інший розробник зробив речі, які взагалі не повинні впливати на мій код, і раптом мої тести почали давати збої. Дав мені величезний переляк!
alexleonard

Одним з недоліків отримання оновлень до ядра Laravel за допомогою Composer є те, що ви не можете читати примітки про оновлення. Все-таки Композитор - це проклятий клас! Я не став би обмінювати його на збір файлів туди-сюди.
racl101

Якби у вас був файл UserSeederRemember_token, він тепер призвів би до недійсності всіх сеансів, і всім довелося б входити знову?
Джеймс,

рятувальник, помиляв мене, чому мій логін перестав працювати.
Едді

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 найкраще підходить для вас, оскільки якщо ваш клас не реалізує всі методи, UserInterfaceі RemindableInterfaceчому вам потрібно сказати, що він це робить.


1
Ви маєте рацію, але він реалізує їх усі, наскільки я бачу ... Принаймні, якщо він використовує поточну версію Laravel.
Марсель Гвердер,

Хм, щойно виникли ті самі проблеми після перетягування проекту, який працює (локально) з репо на сервер та оновлення нового композитора.
Matija Milković

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

Я виправив помилку, додавши UserTraitдо User.php. Отримати оригінальний User.phpфайл тут . Якщо вам не потрібні rememberMeречі, вам просто потрібно це:

<?php

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

class User extends Eloquent implements UserInterface {

    use UserTrait;


}

0

"По-перше, додайте новий, з можливістю обнулення маркер запам'ятовування VARCHAR (100), TEXT або еквівалент вашої таблиці користувачів. Який розміщується таким чином $table->text('remember_token', 100)->nullable();у таблиці, а потім php artisan migrate. І також оновіть до вашої моделі Elq.


0

Користувач класу містить 6 абстрактних методів, тому його слід оголосити абстрактним або реалізувати інші методи

(Illuminate \ Auth \ UserInterface :: getAuthIdentifier,

Illuminate \ Auth \ UserInterface :: getAuthPassword,

Висвітлити \ 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()

тут після коду працює

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.