Laravel4: Aufruf der statischen Methode aus dem instanziierten Klassenobjekt

Normalerweise wird das eloquente Modell wie folgt verwendet:

class Article extends Eloquent
{
//Eloquent Article implementation
}

class MyController extends BaseController
{
 public function getIndex()
 {
  $articles = Article::all();//call static method

  return View::make('articles.index')->with('articles', $articles);
 }
}

Aber wenn Restructuring Dependency Injection verwendet, sieht es so aus:

interface IArticleRepository
{
 public function all();
}

class EloquentArticleRepository implements IArticleRepository
{
 public function __construct(Eloquent $article)
 {
  $this->article = $article;
 }

 public function all()
 {
  return $this->article->all();//call instance method
 }
}

So why we can call the static method Article::all() in form of instance method $this->article->all()?

P/S: Sorry für mein schlechtes Englisch.

0
Ändern Sie public function all() in statische öffentliche Funktion all()
hinzugefügt der Autor Colin Schoen, Quelle

1 Antworten

Gute Frage.

Laravel verwendet das Facade Design Pattern . Wenn Sie Article :: all() aufrufen, geschehen viele Dinge hinter dem Bildschirm. Zuerst PHP versuchen, die statische Methode aufzurufen, wenn es PHP fehlschlägt, rufen Sie sofort eine magische Methode _callStatic auf. dann nimmt Laravel geschickt den statischen Aufruf auf und erstellt eine Instanz der ursprünglichen Klasse.

Aus Laravel doc:

Fassaden bieten eine "statische" Schnittstelle zu Klassen, die im IoC-Container der Anwendung verfügbar sind. Laravel kommt mit vielen Fassaden, und Sie haben sie wahrscheinlich benutzt, ohne es zu wissen!

Weitere Informationen:

http://laravel.com/docs/facades

http://usman.it/laravel-4-uses-static-not- wahr/

0
hinzugefügt
Werfen Sie einen Blick auf diese: stackoverflow.com/questions/15070809/…
hinzugefügt der Autor Manuel Pedrera, Quelle
Danke, dass du mir geantwortet hast. Meiner Meinung nach bezieht sich Facade auf die Laravel-Kernklasse, nicht auf benutzergenerierte Eloquent-Modelle. Ich überflog Illuminate \ Database \ Eloquent \ Model.php (das ist Eloquent Alias) und sah, dass all() hier als statische Methode definiert ist. Liege ich falsch?
hinzugefügt der Autor user3110126, Quelle
PHP - Deutsche Gemeinschaft
PHP - Deutsche Gemeinschaft
5 der Teilnehmer

In dieser Gruppe sprechen wir über PHP. Partner: de.switch-case.com

Laravel - Deutsche Gemeinschaft
Laravel - Deutsche Gemeinschaft
2 der Teilnehmer

In dieser Gruppe sprechen wir über Laravel. Partner: de.switch-case.com