2013-10-16 22 views
6

create() Eloquent yöntemini geçersiz kılıyor, ancak aramaya çalıştığımda Cannot make static method Illuminate\\Database\\Eloquent\\Model::create() non static in class MyModel olsun. Extended/override Eloquent oluşturma yöntemi - Statik olmayan statik yöntem kullanılamıyor

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

Ve MyModel sınıfında

bu var:

böyle create() yöntemini çağırın

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

    parent::create($data); 
} 

neden değil bu iş? Çalışması için neyi değiştirmeliyim?

cevap

21

hata söylediği gibi:

Tabii
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); 
} 

da statik biçimde onu çağırmak gerekir yöntem Illuminate\Database\Eloquent\Model::create() statik ve Statik olmayan olarak geçersiz kılınamaz.

Yani auth-check-mantık varsa da yeniden değerlendirebileceği gerçek Modelinin parçasıdır ya da

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

olarak uygulanması ve MyModel::create([...]);

tarafından diyoruz daha iyi Kontrolör veya Yönlendirme taşıyarak Bölüm.

GÜNCELLEME

Bu yaklaşım sürüm 5.4 den çalışmaz. * Itibaren, bunun yerine ifadeyi "yeniden düşünmek" için bu +1 verdiğini bu cevabı https://github.com/laravel/framework/issues/17876#issuecomment-279026028

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

    // ... 

    return $model; 
} 
+3

takip et! Bu mantık MyModel sınıfına ait değil. – DutGRIFF

1

Muhtemelen bunu geçersiz kıldığından ve üst sınıfta static olarak tanımlanmıştır. sizin fonksiyon tanımında kelimeyi static eklemeyi deneyin:

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