PHP code example of my-com / laravel-conditional-actions
1. Go to this page and download the library: Download my-com/laravel-conditional-actions 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/ */
my-com / laravel-conditional-actions example snippets
class ToysPriceTarget implements TargetContract
{
use RunsConditionalActions;
/** @var Toy */
public $toy;
/** @var User */
public $user;
public $finalPrice;
public function __construct(Toy $toy, User $user)
{
$this->toy = $toy;
$this->user = $user;
}
/**
* Gets state from target.
*
* @return StateContract
*/
public function getInitialState(): StateContract
{
return $this->newState([
'price' => $this->toy->price,
]);
}
/**
* Sets the state to the target.
*
* @param StateContract $state
*/
public function applyState(StateContract $state): void
{
$this->finalPrice = $state->getAttribute('price');
}
/**
* Gets root target conditions.
*
* @return iterable|ConditionContract[]
*/
public function getRootConditions(): iterable
{
return $this->toy->getRootConditions();
}
/**
* Gets children target conditions.
*
* @param int $parentId
*
* @return iterable|ConditionContract[]
*/
public function getChildrenConditions(int $parentId): iterable
{
return $this->toy->getChildrenConditions($parentId);
}
}
class HasPaidToysCondition extends BaseCondition
{
/** @var ToysService */
private $toysService;
// You can use dependency injection in constructor
public function __construct(ToysService $toysService)
{
$this->toysService = $toysService;
}
/**
* Runs condition check.
*
* @param TargetContract $target
* @param StateContract $state
*
* @return bool
*/
public function check(TargetContract $target, StateContract $state): bool
{
$toyId = $this->parameters['toy_id'] ?? null;
if (!($target instanceof ToysPriceTarget) || is_null($toyId)) {
return false;
}
return $this->toysService->hasPaidToy($target->user, $toyId);
}
}
class TodayIsBirthdayCondition extends BaseCondition
{
/** @var ToysService */
private $toysService;
// You can use dependency injection in constructor
public function __construct(ToysService $toysService)
{
$this->toysService = $toysService;
}
/**
* Runs condition check.
*
* @param TargetContract $target
* @param StateContract $state
*
* @return bool
*/
public function check(TargetContract $target, StateContract $state): bool
{
if (!($target instanceof ToysPriceTarget)) {
return false;
}
return Carbon::now()->isSameDay($target->user->birthday);
}
}
class DiscountAction extends BaseAction
{
/**
* Applies action to the state and returns a new state.
*
* @param StateContract $state
*
* @return StateContract
*/
public function apply(StateContract $state): StateContract
{
$discount = $this->parameters['discount'] ?? 0;
$currentPrice = $state->getAttribute('price');
$state->setAttribute('price', $currentPrice - $currentPrice / 100 * $discount);
return $state;
}
}
use ConditionalActions\ConditionalActions;
use Illuminate\Support\ServiceProvider;
class RouteServiceProvider extends ServiceProvider
{
// ...
public function register()
{
ConditionalActions::routes();
}
}
# This example is not an API. You can create API as you needed.
/** @var Toy $toy */
$toy = Toy::find(10);
/** @var Condition $allOf */
$allOf = $toy->conditions()->create([
'name' => 'AllOfCondition',
'starts_at' => '2019-05-01 00:00:00',
'ends_at' => '2019-05-01 23:59:59',
]);
$allOf->actions()->create([
'name' => 'DiscountAction',
'parameters' => ['discount' => 10],
]);
$todayIsBirthday = $allOf->childrenConditions()->make([
'name' => 'TodayIsBirthdayCondition',
]);
$hasPaidToy = $allOf->childrenConditions()->make([
'name' => 'HasPaidToysCondition',
'parameters' => ['toy_id' => 5],
]);
$toy->conditions()->saveMany([$allOf, $hasPaidToy, $todayIsBirthday]);
$toy = Toy::find(10);
// Create a target instance
$target = new ToysPriceTarget(Auth::user(), $toy);
/*
* Run conditional actions.
* This method will iterate over all its conditions stored in database and apply actions related to succeed conditions
*/
$newState = $target->runConditionalActions();
dump($newState->getAttribute('price'));