2013-06-24 17 views
6

Tôi có một giao diện tuyên bố nhu cầu triển khai thực hiện các phương pháp như find, findOrFail vv, về cơ bản phương thức eloquent Laravel.thông báo các phương thức giao diện được thực hiện thông qua __call?

Tôi khai báo các phương thức này trong giao diện vì không phải mọi thứ thực hiện giao diện sẽ mở rộng hùng hồn vì vậy tôi khai báo chúng trong giao diện để ứng dụng của tôi luôn biết các phương thức sẽ có ở đó.

Những gì tôi muốn biết là, ngoài việc có một loạt các phương pháp public function find($id){return parent::find($id)} gõ vào các mô hình mà làm mở rộng mô hình hùng hồn là có một cách dễ dàng để cho giao diện biết rằng phương pháp này được xử lý qua __call?

+0

Xem thêm: https: //bugs.php.net/bug.php?id=41162. –

Trả lời

3

Không điều này sẽ không hoạt động. Trong khi __call() thực sự là tốt đẹp cho một phong cách mã hóa năng động đó là bất lợi là bạn không thể thực thi chữ ký của các phương pháp năng động trong một giao diện và bạn sẽ không nhận được một tài liệu tự động cho nó.

Nhưng tôi nghĩ nếu bạn đang ở thời điểm bạn muốn tạo giao diện cho các phương pháp đó, sẽ không cần phải sử dụng __call() nữa. Tôi chỉ cần hardcode các phương pháp.

+0

Dường như bạn có vấn đề về thiết kế. Muốn giúp đỡ nhiều hơn nhưng câu hỏi có chút mơ hồ. Bạn có thể hiển thị một ví dụ cơ bản không? – hek2mgl

4

Mặc dù có thể là một câu hỏi lớn hơn như sự sạch sẽ của một thiết kế như vậy, bạn có thể thực hiện một cái gì đó giống như điều này bằng cách sử dụng một đặc điểm mà thực hiện các phương pháp của giao diện:

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

Cuối cùng tôi quyết định thăng hoa, bởi vì tôi nghĩ nó thực sự thông minh. Tôi do dự một lúc bởi vì tôi nghĩ nó thực sự thông minh. –

+1

Tôi đồng ý với Dennis, đây thường là một ý tưởng tồi. Việc sử dụng chính cho một cái gì đó như thế này là học tập/tò mò/dễ thương. Nó có lẽ không nên được sử dụng trong mã thế giới thực. – Gabriel