Error inesperado de Laravel “el usuario de clase contiene 3 métodos abstractos…”

7 minutos de lectura

avatar de usuario
Thanos Paravantis

Mientras programaba mi aplicación de autenticación en Laravel, encontré un error que nunca antes había visto. He estado haciendo una lluvia de ideas durante casi una hora para encontrar la causa de este problema, pero aún no puedo encontrar una solución.

Error:

El usuario de clase contiene 3 métodos abstractos y, por lo tanto, debe declararse abstracto o implementar los métodos restantes (Illuminate\Auth\UserInterface::getRememberToken, Illuminate\Auth\UserInterface::setRememberToken, Illuminate\Auth\UserInterface::getRememberTokenName)

Usuario.php Modelo:

<?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;
}

}

Y el 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.');
}
}

  • ¿Qué versión de Laravel estás usando?

    – sam

    15/04/2014 a las 21:12

  • Controlar RemindableInterface.php y UserInterface.php para asegurarse de haber tenido en cuenta todos los métodos de su clase. Todos deberían estar allí tal como están, a menos que los haya modificado en absoluto.

    – usuario1669496

    15/04/2014 a las 21:23

  • Acabo de comprobar laravel.com. Siga estas instrucciones para obtener instrucciones de actualización laravel.com/docs/upgrade#upgrade-4.1.26

    – usuario1669496

    15/04/2014 a las 21:31

  • @ user3158900 Esta debería ser una respuesta porque definitivamente resolverá el problema. No olvide agregar un breve resumen de la solución además del enlace.

    – Marcel Gwerder

    15/04/2014 a las 21:33


  • @Sam Por lo que puedo recordar, tengo la última versión de Composer, la última instalación de laravel 4.

    – Thanos Paravantis

    15/04/2014 a las 21:40

Lo encontré.

Su actualización de Laravel aparentemente documentada.

Puede consultar los documentos de Laravel para solucionar sus problemas:

“Primero, agregue un nuevo token de recuerdo anulable de VARCHAR (100), TEXTO o equivalente a su tabla de usuarios.

A continuación, si está utilizando el controlador de autenticación Eloquent, actualice su clase de usuario con los siguientes tres métodos:

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

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

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

Ver http://laravel.com/docs/actualizar para mas detalles.

  • ¡Gracias Gracias! Acababa de retirarme después de que el otro desarrollador hiciera cosas que no deberían haber afectado mi código en absoluto y, de repente, mis pruebas comenzaron a fallar. me dio un susto enorme!

    – alexleonard

    16 de abril de 2014 a las 12:12

  • El único inconveniente de obtener actualizaciones del núcleo de Laravel con Composer es que no puedes leer las notas de actualización. ¡Todavía Composer es bastante genial! No lo cambiaría por mover archivos de un lado a otro.

    – racl101

    16 de abril de 2014 a las 15:49

  • Si tuvieras un UserSeeder con el token de recuerdo, ¿ahora invalidaría todas las sesiones y todos tendrían que iniciar sesión nuevamente?

    – Jaime

    17 de abril de 2014 a las 8:32

  • salvavidas, me estaba molestando por qué mi inicio de sesión dejó de funcionar.

    – Emán

    21 de abril de 2014 a las 14:09

  • ¿Un cambio importante en el lanzamiento de un parche? Esto es ridículo, estoy bloqueando la versión exacta en mi compositor por ahora. ¡Gracias por encontrar la respuesta!

    – Simón Kjellberg

    6 mayo 2014 a las 17:13

avatar de usuario
Sam

No soy un profesional en la implementación Interfaces PHPpero creo que debe incluir todos los métodos de UserInterface y RemindableInterface en tus User clase (ya que los implementa). De lo contrario, la clase es “resumen” y debe definirse como tal.

Según mi conocimiento, una interfaz PHP es un conjunto de pautas que debe seguir una clase. Por ejemplo, puede tener una interfaz general para una tabla de base de datos específica. Incluiría la definición de métodos como getRow(), insertRow(), deleteRow(), updateColumn(), etc. Luego puede usar esta interfaz para crear múltiples clases diferentes para diferentes tipos de bases de datos (MySQL, PostgreSQL, Redis), pero todas deben seguir las reglas de la interfaz. Esto facilita la migración, ya que sabe que no importa qué controlador de base de datos esté utilizando para recuperar datos de una tabla, siempre implementará los mismos métodos definidos en su interfaz (en otras palabras, abstrayendo la lógica específica de la base de datos de la clase).

3 posibles soluciones, que yo sepa:

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
}

Creo que el n. ° 2 es mejor para usted, ya que si su clase no implementa todos los métodos de UserInterface y RemindableInterface ¿Por qué necesitarías decir que sí?

  • Tienes razón, pero él los implementa todos por lo que puedo ver… Al menos si usa la versión actual de Laravel.

    – Marcel Gwerder

    15/04/2014 a las 21:11


  • Hm, acabo de tener los mismos problemas después de extraer el proyecto que funciona (localmente) del repositorio al servidor y hacer una nueva actualización del compositor.

    – Matija Milković

    15/04/2014 a las 21:28

Este es un problema de actualización. Laravel nos obliga a actualizar el modelo User.php con el siguiente código para solucionar este problema.

Nota: Este cambio invalidará todas las sesiones existentes de “recuérdame”, por lo que todos los usuarios se verán obligados a volver a autenticarse con su aplicación.

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

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

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

Arreglé el error agregando UserTrait a User.php. Consigue el original User.php expediente aquí. Si no necesitas el rememberMe cosas, solo necesitas esto:

<?php

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

class User extends Eloquent implements UserInterface {

    use UserTrait;


}

avatar de usuario
Ironheartbj18

“Primero, agregue un nuevo token de recuerdo anulable de VARCHAR (100), TEXTO o equivalente a su tabla de usuarios, que se coloca así $table->text('remember_token', 100)->nullable(); en la tabla y luego php artesanal migrar. y actualiza también a tu modelo Elq.

avatar de usuario
tor

Class User contiene 6 métodos abstractos y, por lo tanto, debe declararse abstracto o implementar los métodos restantes

(Illuminate\Auth\UserInterface::getAuthIdentifier,

Illuminate\Auth\UserInterface::getAuthPassword,

Illuminate\Auth\UserInterface::getRememberToken, …)

avatar de usuario
H. Pauwelyn

Class User contiene 6 métodos abstractos y, por lo tanto, debe declararse abstracto o implementar los métodos restantes

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

Solución: Agrega este código en la clase de Usuario (está funcionando para mí)

use Authenticatable, CanResetPassword;

Fuente: GitHub

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad