12

私は、実装がfind、findOrFailなどのメソッド、基本的にLaravelの雄弁なメソッドを必要とすることを宣言するインターフェースを持っています。

これらのメソッドをインターフェイスで宣言するのは、インターフェイスを実装するすべてが雄弁に拡張されるわけではないため、インターフェイスで宣言して、アプリがメソッドがそこにあることを常に認識できるようにするためです。

私が知りたいのは、雄弁なモデルを拡張するモデルにたくさんの型メソッドがあること以外public function find($id){return parent::find($id)}、メソッドが を介して処理されることをインターフェイスに知らせる簡単な方法はありますか?__call

4

2 に答える 2

10

そのような設計のクリーンさに関してはより大きな問題があるかもしれませんが、インターフェイスのメソッドを実装するトレイトを使用することで、これに似た何かを達成できます:

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 MagicFindableTrait;
}

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

print (new User)->find(123);
print (new NonmagicalUser)->find(321);
于 2015-02-08T21:55:30.987 に答える
3

いいえ、これは機能しません。動的なコーディング スタイルに__call()は非常に適していますが、インターフェイスで動的メソッドのシグネチャを強制できず、自動化されたドキュメントを取得できないという欠点があります。

しかし、これらのメソッドのインターフェイスを作成したい場合は、__call()もう使用する必要はないと思います。メソッドをハードコードするだけです。

于 2013-06-24T02:01:52.017 に答える