107 lines
2.8 KiB
Markdown
107 lines
2.8 KiB
Markdown
|
# Remote Object Proxy
|
||
|
|
||
|
The remote object implementation is a mechanism that enables a local object to control another object on another server. Each
|
||
|
call method on the local object will do a network call to get information or execute operations on the remote object.
|
||
|
|
||
|
## What is remote object proxy?
|
||
|
|
||
|
A remote object is based on an interface. The remote interface defines the API that a consumer can call. This interface must
|
||
|
be implemented both by the client and the RPC server.
|
||
|
|
||
|
## Adapters
|
||
|
|
||
|
Laminas's RPC components (XmlRpc, JsonRpc & Soap) can be used with the remote object. You will need to require the one
|
||
|
you need via composer:
|
||
|
|
||
|
```sh
|
||
|
$ php composer.phar require laminas/laminas-xmlrpc:2.*
|
||
|
$ php composer.phar require laminas/laminas-json:2.*
|
||
|
$ php composer.phar require laminas/laminas-soap:2.*
|
||
|
```
|
||
|
|
||
|
ProxyManager comes with 3 adapters:
|
||
|
|
||
|
* `ProxyManager\Factory\RemoteObject\Adapter\XmlRpc`
|
||
|
* `ProxyManager\Factory\RemoteObject\Adapter\JsonRpc`
|
||
|
* `ProxyManager\Factory\RemoteObject\Adapter\Soap`
|
||
|
|
||
|
## Usage examples
|
||
|
|
||
|
RPC server side code (`xmlrpc.php` in your local webroot):
|
||
|
|
||
|
```php
|
||
|
interface FooServiceInterface
|
||
|
{
|
||
|
public function foo();
|
||
|
}
|
||
|
|
||
|
class Foo implements FooServiceInterface
|
||
|
{
|
||
|
/**
|
||
|
* Foo function
|
||
|
* @return string
|
||
|
*/
|
||
|
public function foo()
|
||
|
{
|
||
|
return 'bar remote';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$server = new Laminas\XmlRpc\Server();
|
||
|
$server->setClass('Foo', 'FooServiceInterface'); // my FooServiceInterface implementation
|
||
|
$server->handle();
|
||
|
```
|
||
|
|
||
|
Client side code (proxy) :
|
||
|
|
||
|
```php
|
||
|
|
||
|
interface FooServiceInterface
|
||
|
{
|
||
|
public function foo();
|
||
|
}
|
||
|
|
||
|
$factory = new \ProxyManager\Factory\RemoteObjectFactory(
|
||
|
new \ProxyManager\Factory\RemoteObject\Adapter\XmlRpc(
|
||
|
new \Laminas\XmlRpc\Client('https://localhost/xmlrpc.php')
|
||
|
)
|
||
|
);
|
||
|
|
||
|
$proxy = $factory->createProxy('FooServiceInterface');
|
||
|
|
||
|
var_dump($proxy->foo()); // "bar remote"
|
||
|
```
|
||
|
|
||
|
## Implementing custom adapters
|
||
|
|
||
|
Your adapters must implement `ProxyManager\Factory\RemoteObject\AdapterInterface`:
|
||
|
|
||
|
```php
|
||
|
interface AdapterInterface
|
||
|
{
|
||
|
/**
|
||
|
* Call remote object
|
||
|
*
|
||
|
* @param string $wrappedClass
|
||
|
* @param string $method
|
||
|
* @param array $params
|
||
|
*
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function call($wrappedClass, $method, array $params = []);
|
||
|
}
|
||
|
```
|
||
|
|
||
|
To create your implementation (for RESTful web services, for example), pass your adapter instance to your factory at
|
||
|
construction time.
|
||
|
|
||
|
## Known limitations
|
||
|
|
||
|
* methods using `func_get_args()`, `func_get_arg()` and `func_num_arg()` will not function properly for parameters that are
|
||
|
not part of the proxied object interface: use
|
||
|
[variadic arguments](http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list) instead.
|
||
|
|
||
|
## Tuning performance for production
|
||
|
|
||
|
See [Tuning ProxyManager for Production](tuning-for-production.md).
|