我正在使用laravel 4中包含的User类。我正在尝试存储属于用户的新问题,并且用户需要登录才能创建。当我调用问题控制器动作商店时,我收到以下错误
Class User contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (Illuminate\Auth\UserInterface::getAuthPassword, Illuminate\Auth\Reminders\RemindableInterface::getReminderEmail)
我已经在php中阅读了一些抽象方法,虽然我并不完全理解它们,但错误本身给出了问题的两个解决方案,声明了实现重映射方法的类摘要。我猜测,因为这是与laravel一起提供的模型类,正确的解决方案不是将其声明更改为抽象而是实现其余方法。在这种情况下如何正确地执行此操作并继续?
用户模型
<?php
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;
class User extends BaseModel implements UserInterface, RemindableInterface {
protected $guarded = [];
public static $rules = array(
'username' => 'required|unique:users|alpha_dash|min:4',
'password' => 'required|alpha_num|between:4,8|confirmed',
'password_confirmation'=>'required|alpha_num|between:4,8'
);
public function Questions($value='')
{
return $this->hasMany('Question');
}
/**
* 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;
}
}
问题控制器
/**
* Store a newly created resource in storage.
*
* @return Response
*/
public function postStore()
{
$validation = Question::validate(Input::all());
if($validation->passes()) {
Question::create(array(
'question'=>Input::get('question'),
'user_id'=>Auth::user()->id
));
return Redirect::Route('home')
->with('message', 'Your question has been posted.');
} else {
return Redirect::to('user/register')->withErrors($validation)
->withInput();
}
}
编辑1:错误信息包括'(Illuminate \ Auth \ UserInterface :: getAuthPassword,Illuminate \ Auth \ Reminders \ RemindableInterface :: getReminderEmail)'这两个方法在我的user.php中作为publice函数,如上所示那么我还需要做些其他事情来“实施”它们吗?
编辑2:
Laravel Src UserInterface Class
<?php namespace Illuminate\Auth;
interface UserInterface {
/**
* Get the unique identifier for the user.
*
* @return mixed
*/
public function getAuthIdentifier();
/**
* Get the password for the user.
*
* @return string
*/
public function getAuthPassword();
}
laravel src RemindableInterface类
<?php namespace Illuminate\Auth\Reminders;
interface RemindableInterface {
/**
* Get the e-mail address where password reminders are sent.
*
* @return string
*/
public function getReminderEmail();
}
编辑3:
与错误报告相关的php.ini
; error_reporting
; Default Value: E_ALL & ~E_NOTICE
; Development Value: E_ALL | E_STRICT
; Production Value: E_ALL & ~E_DEPRECATED
error_reporting = E_ALL
; Eval the expression with current error_reporting(). Set to true if you want
; error_reporting(0) around the eval().
; http://php.net/assert.quiet-eval
;assert.quiet_eval = 0
basemodel class
<?php
class Basemodel extends Eloquent {
public static function validate($data) {
return Validator::make($data, static::$rules);
}
}
?>
编辑4;
在提供错误时添加正确的模型类,以及现在如何使用修复
<?php
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;
class Question extends BaseModel implements UserInterface, RemindableInterface {
protected $guarded = [];
public static $rules = array(
'questions'=>'required|min:10|max:255',
//'solved'=>'in:0,1',
);
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'questions';
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = array('');
/**
* Get the unique identifier for the question.
*
* @return mixed
*/
public function getAuthIdentifier()
{
return $this->getKey();
}
public function user()
{
return $this->belongsTo('User');
}
}
添加此内容以修复
/**
* 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;
}
答案 0 :(得分:2)
也许用一个例子回答这个问题最简单。说我有以下课程:
abstract class ClassB {
public abstract function foo();
}
class ClassA extends ClassB {}
$a = new ClassA();
运行此代码将导致以下错误:
Fatal error: Class ClassA contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (ClassB::foo)
这意味着我错过foo()
中ClassB
(在ClassA
中定义)的实现。抽象方法只能在抽象类中定义,并且意味着任何非抽象派生类都必须公开一个完整的实现 - 在这种情况下ClassA
不会。可以通过将ClassA
更改为
class ClassA extends ClassB {
// implementation of abstract ClassB::foo().
public function foo() {
echo 'Hello!';
}
}
回到你的例子。您的User
课程延长了BaseModel
。根据{{1}}是否扩展另一个抽象类,它将包含两个定义为BaseModel
的方法,而您的abstract
类缺失。你需要找到这些方法 - 我的错误信息明确地告诉我我错过了什么 - 并在User
中实现它们。