### Remote Object Proxy

The remote object implementation is a mechanism that enables an local object to control an other object on an other 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

ZendFramework's RPC components (XmlRpc, JsonRpc & Soap) can be used easily with the remote object. You will need to require the one you need via composer, though:

    $ php composer.phar require zendframework/zend-xmlrpc:2.*
    $ php composer.phar require zendframework/zend-json:2.*
    $ php composer.phar require zendframework/zend-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):

    interface FooServiceInterface
    {
        public function foo();
    }

    class Foo implements FooServiceInterface
    {
        /**
         * Foo function
         * @return string
         */
        public function foo()
        {
            return 'bar remote';
        }
    }

    $server = new Zend\XmlRpc\Server();
    $server->setClass('Foo', 'FooServiceInterface');  // my FooServiceInterface implementation
    $server->handle();

Client side code (proxy) :

    interface FooServiceInterface
    {
        public function foo();
    }

    $factory = new \ProxyManager\Factory\RemoteObjectFactory(
        new \ProxyManager\Factory\RemoteObject\Adapter\XmlRpc(
            new \Zend\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` :

    interface AdapterInterface
    {
        /**
         * Call remote object
         *
         * @param string $wrappedClass
         * @param string $method
         * @param array $params
         *
         * @return mixed
         */
        public function call($wrappedClass, $method, array $params = array());
    }

It is very easy to create your own implementation (for RESTful web services, for example). Simply pass your own adapter instance to your factory at construction time

Tuning performance for production

See Tuning ProxyManager for Production.