1. Go to this page and download the library: Download vox/restfull-client-mapper library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
vox / restfull-client-mapper example snippets
// uses guzzle to reach webservices
$guzzleClient = new GuzzleHttp\Client();
// obtain a client registry, and register all guzzle clients on it
$registry = new Vox\Webservice\ClientRegistry();
$registry->set('some_client', $guzzleClient);
// instantiate a metadata factory, the second argument for the annotation driver
// is a string with the metadata classes that will be created by the driver
$metadataFactory = new Metadata\MetadataFactory(
new Vox\Metadata\Driver\AnnotationDriver(
new Doctrine\Common\Annotations\AnnotationReader(),
Vox\Webservice\Metadata\TransferMetadata::class
)
);
// A symfony serializer using the provided normalizers on this lib
// is important, however, other normalizers/denormalizers can be used
$serializer = new Symfony\Component\Serializer\Serializer(
[
new Vox\Serializer\Normalizer($metadataFactory),
new Vox\Serializer\Denormalizer(new ObjectHydrator($metadataFactory))
],
[
new Symfony\Component\Serializer\Encoder\JsonEncoder()
]
);
// create a webservice client, its the guy who actualy calls your webservices
$webserviceClient = Vox\Webservice\WebserviceClient($registry, $metadataFactory, $serializer, $serializer);
// Finaly you can obtain a transfer manager
$transferManager = new Vox\Webservice\TransferManager($metadataFactory, $webserviceClient)
use Vox\Webservice\ClientRegistry;
use Vox\Webservice\Factory\ClientFactory;
use Vox\Webservice\Factory\TransferManagerBuilder;
$clientRegistry = new ClientRegistry();
$clientFactory = (new ClientFactory())
->addClient('foo', 'http://foo.localhost', $clientRegistry)
->addClient('bar', 'http://bar.localhost', $clientRegistry);
$builder = new TransferManagerBuilder();
$builder->withClientRegistry($clientRegistry)
->withClientFactory($clientFactory);
$transferManager = $builder->createTransferManager();
$builder->withMetadataCache('file')
->withCacheDir('/tmp/cache');
// Or if you want doctrine caches
$builder->withDoctrineCache(new ApcCache());
//Note that the method withCacheDir, also sets the proxy cache folder
$builder->isTransactional();
// you can also disable by calling $builder->isTransactional(false);
use Vox\Webservice\Mapping\BelongsTo;
use Vox\Webservice\Mapping\Id;
use Vox\Webservice\Mapping\Resource;
/**
* Remember the name setted on the client registry? it will be resolved to the name used on the
* client property on the resource annotation. The route of the resource can be configured on the
* route property of the annotation
*
* @Resource(client="some_client", route="/related")
*/
class Stub
{
/**
* Maps an property as an id, this is mandatory to update and find by id
*
* @Id
*
* @var int
*/
private $id;
/**
* bind this property to receive the id value of a foreign key
*
* @Bindings(source="relation")
*
* @var int
*/
private $relationId;
/**
* does the belongs to relationship mapping, a existing field containing the id of the relation must be indicated
*
* @BelongsTo(foreignField = "relationId")
*
* @var RelationStub
*/
private $belongs;
/**
* does the has one relationship mapping, must indicate a field on the related class that will be matched against
* the value contained on the id of this class
*
* @HasOne(foreignField = "relatedId")
*
* @var RelationStub
*/
private $hasOne;
/**
* does the has many relationship mapping, must indicate a field on the related classes that will be matched against
* the value contained on the id of this class
*
* @HasMany(foreignField = "relatedId")
*
* @var RelationStub
*/
private $hasMany;
public function getRelationId()
{
return $this->relationId;
}
public function getBelongs(): RelationStub
{
return $this->belongs;
}
public function setBlongs(RelationStub $relation)
{
$this->belongs = $relation;
}
public function getHasOne(): RelationStub
{
return $this->hasOne;
}
public function getHasMany(): TransferCollection
{
return $this->hasMany;
}
}
/**
* @Resource(client="some_client", route="/relation")
*/
class RelationStub
{
/**
* @Id
*
* @var int
*/
private $id;
private $name;
public function getId()
{
return $this->id;
}
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
}
// the first argument is the path of where the yml files will be located, the second one is the metadata class to be used
$metadataFactory = new Metadata\MetadataFactory(
new Vox\Metadata\Driver\YmlDriver(
'/project/metadata',
Vox\Webservice\Metadata\TransferMetadata::class
)
);
class Foo
{
/**
* @Id()
*
* @var int
*/
private $firstId;
/**
* @Id()
*
* @var int
*/
private $secondId;
}
class Bar
{
/**
* @var int
*/
private $foreignKeyOne;
/**
* @var int
*/
private $foreignKeyTwo;
/**
* All you need is to use an array of foreign keys instead of a single one
*
* @BelongsTo(foreignField={"foreignKeyOne", "foreignKeyTwo"})
*
* @var Relationship
*/
private $relationship;
}
// fetches a single transfer from the webservice
$stub = $transferManager->find(Stub::class, 1);
// thanks to the proxy pattern and the mapping the relation can be retrieved lazily and automaticly
$relation = $stub->getRelation();
// changes to a proxyed transfer will be tracked
$relation->setName('lorem ipsum');
$stub2 = $transferManager->find(Stub::class, 2);
$stub2->setRelation(new Relation());
$stub3 = new Stub();
$stub3->setRelation(new Relation());
// any new created transfer must be persisted into the unity of work, so it can be posted by the persister
$transferManager->persist($stub3);
// flushes all changes, all posts, puts, etc. will happen here
$transferManager->flush();
class ExampleListener
{
public function prePersist(LifecycleEventInterface $event) {}
public function postPersist(LifecycleEventInterface $event) {}
public function preUpdate(LifecycleEventInterface $event) {}
public function preRemove(LifecycleEventInterface $event) {}
public function postUpdate(LifecycleEventInterface $event) {}
public function preFlush(LifecycleEventInterface $event) {}
public function postFlush(LifecycleEventInterface $event) {}
}
use Vox\Webservice\Event\PersistenceEvents;
use Vox\Webservice\Factory\TransferManagerBuilder;
use Vox\Webservice\EventDispatcher;
//create the event dispatcher
$eventDispatcher = new EventDispatcher();
//register the listsner
$eventDispatcher
->addEventListener(
[
PersistenceEvents::PRE_FLUSH,
PersistenceEvents::PRE_PERSIST,
PersistenceEvents::PRE_UPDATE,
PersistenceEvents::PRE_REMOVE,
PersistenceEvents::POST_FLUSH,
],
new ExampleListener()
);
//register the event dispatcher
$managerBuilder = new TransferManagerBuilder();
$managerBuilder->withEventDispatcher($eventDispatcher);
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.