Programing

Laravel 예기치 않은 오류 "클래스 사용자가 3 개의 추상 메서드를 포함합니다…"

lottogame 2020. 10. 26. 07:37
반응형

Laravel 예기치 않은 오류 "클래스 사용자가 3 개의 추상 메서드를 포함합니다…"


Laravel에서 인증 앱을 프로그래밍하는 동안 이전에 본 적이없는 오류가 발생했습니다. 이 문제의 원인에 대해 거의 한 시간 동안 브레인 스토밍을 해왔지만 해결책을 찾을 수 없습니다.

오류:

Class 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 업데이트입니다.

Laravel 문서를 확인하여 문제를 해결할 수 있습니다.

"먼저, VARCHAR (100), TEXT 또는 이에 상응하는 새로운 nullable remember_token을 사용자 테이블에 추가하십시오.

Next, if you are using the Eloquent authentication driver, update your User class with the following three methods:

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

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

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

"

See http://laravel.com/docs/upgrade for further details.


I'm not a pro at implementing PHP Interfaces, but I believe you need to include all methods of UserInterface and RemindableInterface in your User class (since it implements them). Otherwise, the class is "abstract" and must be defined as such.

By my knowledge, a PHP interface is a set of guidelines that a class must follow. For instance, you can have a general interface for a specific database table. It would include definition of methods like getRow(), insertRow(), deleteRow(), updateColumn(), etc. Then you can use this interface to make multiple different classes for different database types (MySQL, PostgreSQL, Redis), but they must all follow the rules of the interface. This makes migration easier, since you know no matter which database driver you are using to retrieve data from a table it will always implement the same methods defined in your interface (in other words, abstracting the database-specific logic from the class).

3 possible fixes, as far as I know:

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
}

I think #2 is best for you, since if your class doesn't implement all methods from UserInterface and RemindableInterface why would you need to say it does.


This is an update problem. Laravel force us to update the User.php model with the following code to fix this problem.

Note: All existing "remember me" sessions will be invalidated by this change, so all users will be forced to re-authenticate with your application.

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

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

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

I fixed the error by adding UserTrait to User.php. Get the original User.php file here. If you don't need the rememberMe stuff, you just need this:

<?php

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

class User extends Eloquent implements UserInterface {

    use UserTrait;


}

"First, add a new, nullable remember_token of VARCHAR(100), TEXT, or equivalent to your users table. which is put like this $table->text('remember_token', 100)->nullable(); into the table then php artisan migrate. and update to your Elq model too.


Class User contains 6 abstract methods and must therefore be declared abstract or implement the remaining methods

(Illuminate\Auth\UserInterface::getAuthIdentifier,

Illuminate\Auth\UserInterface::getAuthPassword,

Illuminate\Auth\UserInterface::getRememberToken, ...)


Class User contains 6 abstract methods and must therefore be declared abstract or implement the remaining methods

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

Solution: You add this code in User class (it's working for me)

use Authenticatable, CanResetPassword;

Source: GitHub


I also get this error.then i added:

getRememberToken()
setRememberToken($value)
getRememberTokenName()

here after code is working

참고URL : https://stackoverflow.com/questions/23094374/laravel-unexpected-error-class-user-contains-3-abstract-methods

반응형