Page tree
Skip to end of metadata
Go to start of metadata

Remote method invocation (RMI)

Do Viva byla přidána podpora pro vzádlené volání metod aplikačních objektů. 

Definice objektu

Každý objekt, který poskytuje vzdálené volání, musí implementovat interface, který rozšiřuje interface Vivo\Remote\ObjectInterface. Každá metoda obsažená v interfacu ji otvírá možnost být spuštěna vzdáleně.

Ukázka interface pro vzdálené volání
namespace SampleProject\ClientServer;

/**
 * Interface for remote call object
 */
interface ObjectInterface extends \Vivo\RMI\ObjectInterface {

   /**
    * @param int $arg1
    * @param string $arg2
    * @param string|null $arg3
    * @return mixed
    */
   function getSomeData($arg1, $arg2 = '', $arg3 = null);

}

Objekt, který umožňuje vzdálený přístup, musí implementovat tento interface.

Ukázka objektu pro vzdálené volání
namespace SampleProject\ClientServer;

use Vivo\ObjectMixin;

class Object extends \Vivo\Object implements \SampleProject\ClientServer\ObjectInterface {

   use ObjectMixin;

   /**
    * @param int $arg1
    * @param string $arg2
    * @param string|null $arg3
    * @return mixed
    */
   function getSomeData($arg1, $arg2 = '', $arg3 = null)
   {
      return [
         'arg1' => $arg1,
         'arg2' => $arg2,
         'arg3' => $arg3
      ];
   }
}

 

Implementace

Pro implementaci vzdáleného volání je třeba nadefinovat vzdálený aplikační objekt pomocí konfigurace. Hodnotou "class" v aplikačním objektu musí být název interface, nikoli třídy. Povinným argumentem je remoteUrl určující, kam se mají směrovat požadavky na vzdálené volání. Url musí být ve tvaru: http://www.someproject.tld/rmi/nazevVzdalenehoAplikacnihoObjektu.

global.yml - definice objektu
objects:
    remoteObject:
        class: SampleProject\ClientServer\ObjectInterface
        arguments:
            remoteUrl: http://vivoproject.jegert.develop/rmi/localObject

 

Objekt/komponenta využívájící vzdálené volání musí mít tuto závislost na vstupu konstrukturu - bude dosazena pomocí DI.

Ukázka implementace
namespace SampleProject\UI;

use Vivo\CMS\UI\Content\ContentComponentMixin;
use Vivo\UI\Component;

class ClientServerComponent extends Component
{
   use ContentComponentMixin;

   /**
    * @var \SampleProject\ClientServer\ObjectInterface
    */
   private $remoteObject;

   /**
    * @param \SampleProject\ClientServer\ObjectInterface $remoteObject
    */
   function __construct(\SampleProject\ClientServer\ObjectInterface $remoteObject){
      $this->remoteObject = $remoteObject;
   }


   function view()
   {
      echo "Remote object:\n";
      var_export($this->remoteObject->getSomeData('remote1', 'remote2', 'remote3'));
   }
}

 

 

  • No labels