我正在使用存储库模式并尝试建立模型之间的关系。当我尝试运行存储()方法(在控制器中),该方法试图使用用户()方法(与方模型建立关系)时,我收到以下错误消息:
非静态方法不应该静态调用::user(),假设$this来自不兼容的上下文
我不明白为什么在尝试运行user()relationship方法时会出现此错误,但所有其他方法(包括$this-
以下是相关代码:
// PartiesController.php
public function __construct(Party $party){
$this->party = $party
}
public function store(){
$data = Input::all();
$user = Sentry::getUser();
$this->party->user()->create($data);
}
// Party.php
class Party extends Eloquent{
public function user(){
return $this->belongsTo('User');
}
}
// User.php
use Cartalyst\Sentry\Users\Eloquent\User as SentryUserModel;
class User extends SentryUserModel implements UserInterface, RemindableInterface {
public function party(){
return $this->hasMany('Party');
}
}
// PartyRepository.php
namespace repositories\Party;
interface PartyRepository{
public function all();
public function findByID($id);
public function create($input);
public function user();
}
// EloquentPartyRepository.php
namespace repositories\Party;
use Party;
class EloquentPartyRepository implements PartyRepository{
public function all(){
return Party::all();
}
public function create($input){
return Party::create($input);
}
public function user(){
return Party::user();
}
}
这个问题是因为您在静态上下文中调用了非静态方法。您可能已经习惯了Laravel做这些事情的方式(例如< code>User::find()等等)。但实际上,这些并不是静态调用(一个类实例实际上是在幕后解析的,并且在该实例上调用< code>find()方法)。
在您的情况下,它只是一个简单的静态方法调用。PHP会允许这样做,除了在方法中引用<code>$this</code>而PHP不知道如何处理它。根据定义,静态方法调用不知道类的任何实例。
我的建议是将模型类的实例注入到存储库的构造函数中,如下所示:
//Class: EloquentPartyRepository
public function __construct(Party $party)
{
$this->party = $party;
}
public function user($partyId)
{
return $this->party->find($partyId)->user();
}
发送给构造函数的Party
实例不应该是数据库中的记录,而应该是Particle
的空实例(即newParty()
),尽管我相信如果只是将其添加到构造函数中,IoC应该能够利用依赖注入并为您提供实例。
这里有一个等效的实现,它添加了一个byId
方法:
//Class: EloquentPartyRepository
public function __construct(Party $party)
{
$this->party = $party;
}
public function byId($partyId)
{
return $this->party->find($partyId);
}
public function user($partyId)
{
if($party = $this->byId($partyId)) {
return $party->user();
}
return null;
}
我已经解决了这个问题。感谢@watcher和@deczo的反馈。两者都非常有用,并且与此错误消息相关。
最后,我只需要更改一行。我在 store()
函数中顺序错误地进行了方法调用。这是相关代码。
// PartiesController.php
public function store(){
$data = Input::all();
$user = Sentry::getUser();
$user->party()->create($data);
}
在我的例子中,要删除非静态错误并将用户
模型正确插入到方
模型中,我只需要进行上述更改。
我提到了http://laravel.com/docs/eloquent/#inserting-适当序列的相关模型。