PHP code example of slava-basko / specification-php
1. Go to this page and download the library: Download slava-basko/specification-php 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/ */
slava-basko / specification-php example snippets
class AdultUserSpecification extends AbstractSpecification
{
/**
* @param User $candidate
* @return bool
*/
public function isSatisfiedBy($candidate)
{
return $candidate->getAge() >= 18;
}
}
$adultUserSpecification = new TypedSpecification(new AdultUserSpecification(), User::class);
$adultUserSpecification->isSatisfiedBy(new User(20)); // true
$adultUserSpecification->isSatisfiedBy('blah'); // InvalidArgumentException will be thrown
interface UserSpecification
{
public function isSatisfiedBy(User $user);
}
interface ProductSpecification
{
public function isSatisfiedBy(Product $product);
}
interface CartSpecification
{
public function isSatisfiedBy(Cart $cart);
}
interface ParcelSpecification
{
public function isSatisfiedBy(Parcel $parcel);
}
// etc.
new TypedSpecification(new SomeUserSpecification(), User::class);
new TypedSpecification(new SomeProductSpecification(), Product::class);
new TypedSpecification(new SomeCartSpecification(), Cart::class);
new TypedSpecification(new SomeParcelSpecification(), Parcel::class);
/**
* @param User $candidate
* @return bool
*/
public function isSatisfiedBy($candidate)
{
return $candidate->someMethodThatWillBeAutocompletedInYourIDE();
}
$adultPersonSpecification = new AndSpecification([
new AdultSpecification(),
new OrSpecification([
new MaleSpecification(),
new FemaleSpecification(),
])
]);
$adultPersonSpecification->isSatisfiedBy($adultAlien); // false
// because only AdultSpecification was satisfied; assume we know age, and we don't know alien sex.
// Card of spades and not (two or three of spades), or (card of hearts and not (two or three of hearts))
$spec = new OrSpecification([
new AndSpecification([
new SpadesSpecification(),
new NorSpecification([
new PlayingCardSpecification(PlayingCard::SUIT_SPADES, PlayingCard::RANK_2),
new PlayingCardSpecification(PlayingCard::SUIT_SPADES, PlayingCard::RANK_3)
])
]),
new AndSpecification([
new HeartsSpecification(),
new NorSpecification([
new PlayingCardSpecification(PlayingCard::SUIT_HEARTS, PlayingCard::RANK_2),
new PlayingCardSpecification(PlayingCard::SUIT_HEARTS, PlayingCard::RANK_3)
])
]),
]);
$spec->isSatisfiedBy(new PlayingCard(PlayingCard::SUIT_SPADES, PlayingCard::RANK_4)); // true
$spec->isSatisfiedBy(new PlayingCard(PlayingCard::SUIT_SPADES, PlayingCard::RANK_2)); // false
$parcel = [
'value' => 20,
'destination' => 'CA'
];
$trackableParcelSpecification = new AndSpecification([
new HighValueParcelSpecification(),
new OrSpecification([
new DestinationCASpecification(),
new DestinationUSSpecification(),
])
]);
if ($trackableParcelSpecification->isSatisfiedBy($parcel)) {
// do something
} else {
$remainderSpecification = $trackableParcelSpecification->remainderUnsatisfiedBy($parcel);
// do something with $remainderSpecification
}
// $remainderSpecification is equal to
//
// AndSpecification([
// HighValueParcelSpecification
// ]);
//
// because only DestinationXX satisfied
$remainder = Utils::flatten(Utils::toSnakeCase($trackableParcel->remainderUnsatisfiedBy($parcel)));
// $remainder is equal to ['high_value_parcel']
bash
composer
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.