Wzorzec Proxy kontroluje dostęp do klas i obiektów jako pośrednik. Zanim żądanie trafi do prawdziwego podmiotu RealSubject, pośrednik Proxy przetwarza je i jeśli spełnione są odpowiednie kryteria to udostępnia obiekt. Klient nie wie, że jego żądanie przechodzi przez Proxy. Przykładem może być dostęp poprzez logowanie do określonych zasobów serwisu.
SCHEMAT WZORCA PROXY

Źródło: en.wikipedia.org/wiki/Proxy_pattern
PRZYKŁAD
W przykładzie, klient będzie miał dostęp do interfejsu tylko z określonego adresu IP. Możemy założyć, że jest to witryna widoczna tylko dla pracowników firmy, biura itp. Oczywiście, ktoś „z zewnątrz” może również uruchomić stronę znając jej adres, ale otrzyma odpowiedni komunikat z informacją o braku uprawnień.
Pierwszy uczestnik wzorca – interfejs Subject przechowuje samo żądanie – request(), które może być w dowolny sposób implementowane w innych klasach.
1 2 3 4 5 6 7 |
<?php // Subject.php interface Subject { public function request(); } ?> |
Poniższa klasa RealSubject implementuje interfejs Subject i metodę request(). Metoda jest prosta i wyświetla jedynie komunikat z wiadomością dla klienta. Oczywiście może to być cokolwiek innego 🙂 .
1 2 3 4 5 6 7 8 9 10 |
<?php // RealSubject.php class RealSubject implements Subject { public function request() { echo "Do something ..."; } } ?> |
Gwóźdź programu – Proxy implementuje również interfejs Subject oraz żądanie request(). Metoda checkIP() porównuje adres IP użytkownika ze stałym adresem ’127.0.0.1′.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php // Proxy.php class Proxy implements Subject { private $realSubject; const IP = '127.0.0.1'; public function __construct(RealSubject $realSubject) { $this->realSubject = $realSubject; } public function request() { if ($this->checkIP()) { $this->realSubject->request(); } else { echo "You don't have access to this page."; } } private function checkIP() { $IP = $_SERVER['REMOTE_ADDR']; if ($IP == self::IP) { return true; } } } ?> |
Konstruktor pobiera prawdziwy podmiot RealSubject i ustawia jego instancję, aby mieć dostęp do metody request(). Żądanie request() – klasy Proxy – nadpisuje implementację z prawdziwego podmiotu i dodaje warunek sprawdzający IP, poprzez metodę checkIP(). Jeśli żądanie przejdzie poprawną weryfikację adresu IP to wykona się request() z klasy RealSubject:
1 |
$this->realSubject->request(); |
Na koniec tworzymy klasę klienta i testujemy program:
1 2 3 4 5 6 7 8 9 |
<?php // Client.php spl_autoload_register(function ($class_name) { include $class_name . '.php'; }); $realSubject = new RealSubject; $proxy = new Proxy($realSubject); $proxy->request(); ?> |