2013-06-24 3 views
6

Ich habe eine Schnittstelle, die die Implementierung erfordert Methoden wie find, findOrFail etc, im Grunde Laravel eloquent Methoden erklärt.Informierende Schnittstellenmethoden werden über __call implementiert?

Ich deklariere diese Methoden in der Schnittstelle, weil nicht alles, was die Schnittstelle implementiert, eloquent erweitert wird, also erkläre ich sie in der Schnittstelle, so dass meine App immer weiß, dass die Methoden da sein werden.

Was ich möchte wissen, ist, anders als in den Modellen eine Reihe von public function find($id){return parent::find($id)} Typ Methoden mit, die tun erweitern das eloquent Modell gibt es eine einfache Möglichkeit, die Schnittstelle zu können, dass das Verfahren über __call behandelt wird?

+0

Siehe auch: https: //bugs.php.net/bug.php?id=41162. –

Antwort

3

Nein, das wird nicht funktionieren. Während __call() ist wirklich schön für eine dynamische Codierung Stil ist es Nachteile, dass Sie die Signaturen der dynamischen Methoden in einer Schnittstelle nicht erzwingen können, und Sie werden nicht eine automatisierte Dokumentation dafür erhalten.

Aber ich denke, wenn Sie an einem Punkt sind, wo Sie eine Schnittstelle für diese Methoden erstellen möchten, sollte __call() nicht mehr benötigt werden. Ich würde einfach hardcode die Methoden.

+0

Scheint, dass Sie ein Designproblem haben. Möchte mehr helfen, aber die Frage ist ein bisschen vage. Können Sie ein grundlegendes Beispiel zeigen? – hek2mgl

4

Obwohl es kann eine größere Frage in Bezug auf die Sauberkeit eines solchen Design, Sie so etwas wie dies durch die Verwendung einer Eigenschaft, die die Methoden der Schnittstelle implementiert erreichen kann:

interface FindableContract { 
    public function find($id); 
} 

trait MagicFindableTrait { 
    public function find($id) { 
     return static::__call(__FUNCTION__, func_get_args()); 
    } 
} 

class MagicalParent { 
    public function __call($method, $args) { 
     if ($method == 'find') { 
      return "User " . $args[0] . " is a witch! May we burn her?!"; 
     } 
    } 
} 

class User extends MagicalParent implements FindableContract { 
    use FindableTrait; 
} 

class NonmagicalUser implements FindableContract { 
    public function find($id) { 
     return "User $id was found to be nonmagical. Let's burn him anyway."; 
    } 
} 

print (new User)->find(123); 
print (new NonmagicalUser)->find(321); 
+1

Am Ende habe ich beschlossen zu upvote, weil ich denke, dass es wirklich schlau ist. Ich habe eine Weile gezögert, weil ich denke, dass es wirklich schlau ist. –

+1

Ich stimme zu, Dennis, das ist im Allgemeinen eine sehr schlechte Idee. Die primäre Verwendung für so etwas ist akademisch/Neugier/Niedlichkeit. Es sollte wahrscheinlich nicht in realem Code verwendet werden. – Gabriel

Verwandte Themen