2013-08-20 18 views
40

Im próbuje załadować mojego modelu w moim kontrolera i próbowała to:Dlaczego otrzymuję komunikat "Metoda niestatyczna nie powinna być wywoływana statycznie" podczas wywoływania metody w modelu wymownym?

return Post::getAll(); 

dostał błąd Non-static method Post::getAll() should not be called statically, assuming $this from incompatible context

Funkcja w modelu wygląda tak:

public function getAll() 
{ 

    return $posts = $this->all()->take(2)->get(); 

} 

Co to jest poprawny sposób załadować model w kontrolerze, a następnie zwrócić jego zawartość?

+0

2 sposoby. 1. Utwórz instancję modelu i użyj '$ obj-> getAll()' lub ustaw funkcję jako statyczną. – itachi

+2

Kiedy używasz: '::' próbujesz uzyskać dostęp do metody * statycznie *, więc twój podpis funkcji powinien być zadeklarowany jako: 'public static function getAll()'. –

+0

@Sam, polecam Ci pięciominutowe czytanie o OOP i statycznych metodach w PHP: http://php.net/manual/en/language.oop5.static.php –

Odpowiedz

47

Zdefiniowałeś swoją metodę jako niestatyczną i próbujesz wywołać ją jako statyczną. Że powiedział ...

  1. ... jeśli chcesz wywołać metodę statyczną, należy użyć :: i zdefiniować jako metoda statyczna.

    // Defining a static method in a Foo class. 
    public static function getAll() { /* code */ } 
    
    // Invoking that static method 
    Foo::getAll(); 
    
  2. ... inaczej, jeśli chcesz wywołać metodę instancji powinieneś instancja swoją klasę, użyj ->.

    // Defining a non-static method in a Foo class. 
    public function getAll() { /* code */ } 
    
    // Invoking that non-static method. 
    $foo = new Foo(); 
    $foo->getAll(); 
    

Uwaga W laravel, prawie wszystkie metody wymowny powrócić instancję modelu, co pozwala na metodach łańcucha, jak pokazano poniżej:

$foos = Foo::all()->take(10)->get(); 

W tym kodzie jesteśmy statycznie wywołanie metody all przez elewację. Następnie wszystkie inne metody są wywoływane jako metody instancji.

+0

jak to getAll() niestatyczne w 2 opcja?? –

+1

Dzięki @TryingTobemyself powiadomić mnie o tym. Zaktualizowałem swoją odpowiedź z twoją sugestią. –

+7

'W Laravel, prawie wszystkie Eloquent metody są zdefiniowane jako statyczne' .... to nieporozumienie. ** NONE ** są statyczne. – itachi

20

Dlaczego nie spróbować dodać zakresu? Zakres jest bardzo dobrą cechą Eloquent.

class User extends Eloquent { 

    public function scopePopular($query) 
    { 
     return $query->where('votes', '>', 100); 
    } 

    public function scopeWomen($query) 
    { 
     return $query->whereGender('W'); 
    } 

} 

$users = User::popular()->women()->orderBy('created_at')->get(); 

Eloquent #scopes in Laravel Docs

+1

IMO powinno to być zaakceptowaną odpowiedzią, ponieważ jest ona specyficzna dla Laravella, a odpowiedź Rubensa jest poprawna, ale nie dość konkretna. – jacobross85

0

Można dać się ten

public static function getAll() 
{ 

    return $posts = $this->all()->take(2)->get(); 

} 

i kiedy zadzwonić statycznie wewnątrz funkcji kontrolera także ..

-1

mam dosłownie przybył w odpowiedzi mój przypadek. Tworzę system, który zaimplementował metodę create, więc otrzymałem ten faktyczny błąd, ponieważ uzyskiwałem dostęp do zastąpionej wersji, a nie wersji Eloquent.

Mam nadzieję, że pomoc?

0

Sprawdź, czy nie zadeklarowano metody getAll() w modelu. To powoduje, że kontroler myśli, że wywołujesz metodę niestatyczną.

Powiązane problemy