1. Go to this page and download the library: Download othercodes/ddd-value-object 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/ */
othercodes / ddd-value-object example snippets
declare(strict_types=1);
class Speed extends OtherCode\DDDValueObject\ValueObject
{
public const KILOMETERS_PER_HOUR = 'km/h';
public const MILES_PER_HOUR = 'm/h';
public function __construct(int $amount, string $magnitude)
{
$this->initialize([
'amount' => $amount,
'magnitude' => $magnitude
]);
$this->checkInvariants();
}
protected function invariantSpeedMustBeGreaterThanZero(): bool
{
return $this->amount() > 0;
}
protected function invariantMagnitudeMustBeValid(): bool
{
return in_array($this->magnitude(), [
self::KILOMETERS_PER_HOUR,
self::MILES_PER_HOUR
]);
}
public function amount(): int
{
return $this->get('amount');
}
public function magnitude(): string
{
return $this->get('magnitude');
}
public function increase(Speed $speed): self
{
if ($speed->magnitude() !== $this->magnitude()) {
throw new InvalidArgumentException('The given magnitude is not valid.');
}
return new self($this->amount() + $speed->amount(), $this->magnitude());
}
public function __toString(): string
{
return $this->amount() . $this->magnitude();
}
}
declare(strict_types=1);
class Speed extends OtherCode\DDDValueObject\ValueObject
{
// ...
public function equalityHash(): string
{
return md5(sprintf('$s %s', $this->amount(), $this->magnitude());
}
// ...
}
$s = new Speed(120, 'km/h');
$s->amount = 123;
// PHP Fatal error: Uncaught OtherCode\DDDValueObject\Exceptions\ImmutableValueException: Illegal attempt to change immutable value.
declare(strict_types=1);
class Speed extends OtherCode\DDDValueObject\ValueObject
{
// ...
protected string $immutabilityException = SomeCustomException::class;
protected array $immutabilityMessages = [
'default' => 'You shall not update this value!.',
];
// ...
}
$s = new Speed(-1, 'm/s');
// PHP Fatal error: Uncaught InvalidArgumentException: Unable to create Speed value object due:
// invariant speed must be greater than zero
// invariant magnitude must be valid
declare(strict_types=1);
class Speed extends OtherCode\DDDValueObject\ValueObject
{
// ...
protected function invariantSpeedMustBeGreaterThanZero(): bool
{
if($this->amount() < 0) {
throw new InvalidArgumentException('The given speed value is not valid');
}
return true;
}
// ...
}
$s = new Speed(-1, 'm/s');
// PHP Fatal error: Uncaught InvalidArgumentException: Unable to create Speed value object due:
// The given speed value is not valid
// invariant magnitude must be valid
declare(strict_types=1);
class Speed extends OtherCode\DDDValueObject\ValueObject
{
// ...
public function __construct(int $amount, string $magnitude)
{
$this->initialize([
'amount' => $amount,
'magnitude' => $magnitude
]);
$this->checkInvariants(function (array $violations) {
throw new RuntimeException("Epic fail due:\n-" . implode("\n-", $violations) . "\n");
});
}
protected function invariantSpeedMustBeGreaterThanZero(): bool
{
if($this->amount() < 0) {
throw new InvalidArgumentException('The given speed value is not valid');
}
return true;
}
// ...
}
$s = new Speed(-120, 'clicks/s');
// PHP Fatal error: Uncaught RuntimeException: Epic fail due:
// - The given speed value is not valid
// - invariant magnitude must be valid
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.