2013-10-16 140 views
6

我重寫了create() Eloquent方法,但是當我嘗試調用它時,我得到Cannot make static method Illuminate\\Database\\Eloquent\\Model::create() non static in class MyModel擴展/重寫Eloquent創建方法 - 不能使靜態方法非靜態

我稱之爲create()方法是這樣的:

$f = new MyModel(); 
$f->create([ 
    'post_type_id' => 1, 
    'to_user_id' => Input::get('toUser'), 
    'from_user_id' => 10, 
    'message' => Input::get('message') 
]); 

而在MyModel類我有這樣的:

public function create($data) { 
    if (!Namespace\Auth::isAuthed()) 
     throw new Exception("You can not create a post as a guest."); 

    parent::create($data); 
} 

爲什麼不這項工作?我應該改變什麼才能使它工作?

回答

21

:該方法Illuminate\Database\Eloquent\Model::create()是靜態的,不能被重寫爲非靜態的。

所以實現它作爲

class MyModel extends Model 
{ 
    public static function create($data) 
    { 
     // .... 
    } 
} 

MyModel::create([...]);

調用它,你也可能會重新考慮,如果AUTH檢查邏輯是模型真的部分或更好的將它移動到控制器或路由部分。

UPDATE

這種方法不會從5.4版本。*開始,而不是按照這個答案https://github.com/laravel/framework/issues/17876#issuecomment-279026028

public static function create(array $attributes = []) 
{ 
    $model = static::query()->create($attributes); 

    // ... 

    return $model; 
} 
+3

我給這一個+1,爲 「重新思考」 的聲明!這個邏輯不屬於MyModel類。 – DutGRIFF

1

可能因爲您重寫它而在父類中定義爲static。 嘗試在你的函數定義添加單詞static

public static function create($data) 
{ 
    if (!Namespace\Auth::isAuthed()) 
    throw new Exception("You can not create a post as a guest."); 

    return parent::create($data); 
} 

當然,你還需要調用它以靜態方式:由於錯誤說

$f = MyModel::create([ 
    'post_type_id' => 1, 
    'to_user_id' => Input::get('toUser'), 
    'from_user_id' => 10, 
    'message' => Input::get('message') 
]);