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


Программируя свое приложение аутентификации на Laravel, я столкнулся с ошибкой, которую никогда раньше не видел. Я почти час провел мозговой штурм в поисках причины этой проблемы, но пока не могу найти решение.

Ошибка:

Класс User содержит 3 абстрактных метода и поэтому должен быть объявлен абстрактным или реализовывать остальные методы (Illuminate\Auth\Интерфейс пользователя::getremembertoken, Illuminate\Auth\Интерфейс пользователя::setremembertoken, Осветить\Аутентификацию\Интерфейс пользователя::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.');
}
}
 71
Author: madhead, 2014-04-16

8 answers

Я нашел его.

Его явно задокументированное обновление Laravel.

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

"Во-первых, добавьте новый, обнуляемый remember_token VARCHAR(100), ТЕКСТ или эквивалент вашей таблицы пользователей.

Далее, если вы используете драйвер аутентификации Eloquent, обновите свой класс пользователя следующими тремя методами:

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 для получения более подробной информации.

 173
Author: Matija Milković, 2014-04-15 21:41:04

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

 4
Author: Sam, 2014-04-15 21:09:05

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

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

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

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

public function getRememberTokenName()
{
    return 'remember_token';
}
 2
Author: Bastin Robin, 2014-05-06 13:51:12

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

<?php

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

class User extends Eloquent implements UserInterface {

    use UserTrait;


}
 0
Author: sqren, 2014-09-10 03:57:12

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

 0
Author: Ironheartbj18, 2014-12-04 20:34:04

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

(Осветить\Аутентификацию\Интерфейс пользователя::Getauthidentifier,

Осветить\Аутентификацию\Интерфейс пользователя::getauthpassword,

Осветить\Аутентификацию\Интерфейс пользователя::Getremembertoken, ...)

 0
Author: luiggi, 2016-04-01 19:25:25

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

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

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

use Authenticatable, CanResetPassword;

Источник: GitHub

 0
Author: Fabien Munoz, 2016-08-21 07:51:10

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

getRememberToken()
setRememberToken($value)
getRememberTokenName()

Здесь после того, как код заработает

 -1
Author: rocketz, 2014-05-21 14:20:04