1. Go to this page and download the library: Download phpsagas/orchestrator 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/ */
phpsagas / orchestrator example snippets
class BuyTourSaga
{
// ...
public function getSagaDefinition(): SagaDefinition
{
$steps = $this
->step()
->localCommand($buyTourCommand) // <-- compensatable transaction
->withCompensation($rejectTourCommand) // <-- compensating transaction
->step()
->remoteCommand($bookTicketsCommand)
->withCompensation($rejectTicketsBookingCommand)
->step()
->remoteCommand($bookHotelCommand)
->withCompensation($rejectHotelBookingCommand)
->step()
->remoteCommand($obtainVisaCommand) // <-- pivot transaction
->onReply($obtainVisaReplyHandler)
->step()
->remoteCommand($confirmHotelBookingCommand) // <-- retryable transaction
->step()
->remoteCommand($confirmTicketsBookingCommand)
->step()
->localCommand($confirmTourCommand);
;
return $steps->build();
}
public function onFinished(string $sagaId, SagaDataInterface $data): void
{
// notify request initiator about successful outcome
}
public function getSagaType(): string
{
return 'buy_tour_saga';
}
private function step(): StepBuilder
{
return new StepBuilder(new SagaDefinitionBuilder());
}
}
class BuyTourCommand implements LocalCommandInterface
{
private $tourService;
// inject your project service
public function __construct(TourService $tourService)
{
$this->tourService = $tourService;
}
/**
* @param SagaDataInterface|BuyTourSagaData $sagaData
*/
public function execute(SagaDataInterface $sagaData): void
{
// buyTour logic incapsulated behind project service, not here
$tour = $this->tourService->buyTour(
$sagaData->getCountry(),
$sagaData->getCity(),
$sagaData->getDateFrom(),
$sagaData->getDateTill()
);
// set created tour id to saga data for next commands usage
$sagaData->setTourId($tour->getId());
}
public function getSagaDataType(): string
{
return BuyTourSagaData::class;
}
}
class BookTicketsCommand implements RemoteCommandInterface
{
public function getCommandType(): string
{
return 'book_tickets_command';
}
public function getSagaDataClassName(): string
{
return BuyTourSagaData::class;
}
/**
* Returns data using by another application services.
*
* @param SagaDataInterface|BuyTourSagaData $sagaData
*
* @return CommandDataInterface
*/
public function getCommandData(SagaDataInterface $sagaData): CommandDataInterface
{
return new BookTicketsData(
$sagaData->getCountry(),
$sagaData->getCountry(),
$sagaData->getDateFrom(),
$sagaData->getDateTill()
);
}
class BookHotelReplyHandler implements ReplyHandlerInterface
{
/**
* @param ReplyMessage $message
* @param SagaDataInterface|BuyTourSagaData $sagaData
*/
public function handle(ReplyMessage $message, SagaDataInterface $sagaData): void
{
if ($message->isSuccess()) {
$payload = json_decode($message->getPayload(), true);
$sagaData->setHotelBookingId($payload['hotelBookingId']);
}
}
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.