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

71

При программировании моего приложения аутентификации на 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.');
}
}
  • 0
    Какую версию Laravel вы используете?
  • 0
    Проверьте RemindableInterface.php и UserInterface.php чтобы убедиться, что вы UserInterface.php все методы в своем классе. Все они должны быть там, как есть, если только вы не изменили их вообще.
Показать ещё 4 комментария
Теги:

8 ответов

173
Лучший ответ

А нашел его.

Это, по-видимому, документальное обновление 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.

  • 1
    Спасибо Спасибо! Я только что вытащил после того, как другой разработчик сделал вещи, которые не должны были повлиять на мой код вообще, и вдруг мои тесты начали терпеть неудачу. Дал мне огромный испуг!
  • 0
    Одним из недостатков получения обновлений ядра Laravel с помощью Composer является то, что вы не можете читать заметки об обновлениях. Композитор все еще чертовски хорош! Я бы не променял его на пересылку файлов туда-сюда.
Показать ещё 8 комментариев
4

Я не профессионал в реализации 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, зачем вам это нужно.

  • 1
    Вы правы, но он реализует их все, насколько я вижу ... По крайней мере, если он использует текущую версию Laravel.
  • 0
    Интересно, он делает ..
Показать ещё 1 комментарий
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

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

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

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

use Authenticatable, CanResetPassword;

Источник: GitHub

0

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

(Illuminate\Auth\UserInterface:: getAuthIdentifier,

Illuminate\Auth\UserInterface:: getAuthPassword,

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

0

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

0

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

<?php

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

class User extends Eloquent implements UserInterface {

    use UserTrait;


}
-2

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

getRememberToken()
setRememberToken($value)
getRememberTokenName()

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню