Skip to content

Commit

Permalink
Merge pull request #422 from nextras/custom_datetime
Browse files Browse the repository at this point in the history
entity: allow DateTimeImmutable subclasses [closes #306]
  • Loading branch information
hrach committed May 28, 2020
2 parents ad40131 + 556b8ac commit 88f4476
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 48 deletions.
7 changes: 1 addition & 6 deletions src/Entity/Reflection/MetadataParser.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@


use DateTime;
use DateTimeImmutable;
use Nette\Utils\Reflection;
use Nextras\Orm\Collection\ICollection;
use Nextras\Orm\Entity\Embeddable\EmbeddableContainer;
Expand Down Expand Up @@ -230,11 +229,7 @@ protected function parseAnnotationTypes(PropertyMetadata $property, string $type
$type = $aliases[$typeLower];
} else {
$type = Reflection::expandClassName($type, $this->currentReflection);
if ($type === DateTimeImmutable::class || $type === \Nextras\Dbal\Utils\DateTimeImmutable::class) {
// these datetime types are allowed
} elseif (is_subclass_of($type, DateTimeImmutable::class)) {
throw new NotSupportedException("Type '{$type}' in {$this->currentReflection->name}::\${$property->name} property is not supported (a subclass of \DateTimeImmutable). Use directly the \DateTimeImmutable or \Nextras\Dbal\Utils\DateTimeImmutable type.");
} elseif ($type === DateTime::class || is_subclass_of($type, DateTime::class)) {
if ($type === DateTime::class || is_subclass_of($type, DateTime::class)) {
throw new NotSupportedException("Type '{$type}' in {$this->currentReflection->name}::\${$property->name} property is not supported anymore. Use \DateTimeImmutable or \Nextras\Dbal\Utils\DateTimeImmutable type.");
}
}
Expand Down
63 changes: 21 additions & 42 deletions src/Entity/Reflection/PropertyMetadata.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,10 @@
namespace Nextras\Orm\Entity\Reflection;


use DateTime;
use DateTimeImmutable;
use DateTimeInterface;
use DateTimeZone;
use Nette\SmartObject;
use Nextras\Dbal\Utils\DateTimeImmutable;
use Nextras\Orm\Entity\IProperty;
use Nextras\Orm\InvalidStateException;

Expand Down Expand Up @@ -114,46 +113,8 @@ public function isValid(&$value): bool
return in_array($value, $this->enum, true);
}

foreach ($this->types as $type => $_) {
if ($type === \DateTimeImmutable::class) {
if ($value instanceof \DateTimeImmutable) {
return true;

} elseif ($value instanceof DateTime) {
$value = new \DateTimeImmutable($value->format('c'));
return true;

} elseif (is_string($value) && $value !== '') {
$tmp = new \DateTimeImmutable($value);
$value = $tmp->setTimezone(new DateTimeZone(date_default_timezone_get()));
return true;

} elseif (ctype_digit($value)) {
$value = new \DateTimeImmutable("@{$value}");
return true;
}

} elseif ($type === DateTimeImmutable::class) {
if ($value instanceof DateTimeImmutable) {
return true;

} elseif ($value instanceof DateTimeInterface) {
$value = new DateTimeImmutable($value->format('c'));
return true;

} elseif (is_string($value) && $value !== '') {
$tmp = new DateTimeImmutable($value);
$value = $tmp->setTimezone(new DateTimeZone(date_default_timezone_get()));
return true;

} elseif (ctype_digit($value)) {
$value = new DateTimeImmutable("@{$value}");
return true;
}

}

$type = strtolower($type);
foreach ($this->types as $rawType => $_) {
$type = strtolower($rawType);
if ($type === 'string') {
if (is_string($value)) {
return true;
Expand Down Expand Up @@ -214,6 +175,24 @@ public function isValid(&$value): bool
} elseif ($type === 'mixed') {
return true;

} elseif ($rawType === DateTimeImmutable::class || is_subclass_of($rawType, DateTimeImmutable::class)) {
if ($value instanceof $rawType) {
return true;

} elseif ($value instanceof DateTimeInterface) {
$value = new $rawType($value->format('c'));
return true;

} elseif (is_string($value) && $value !== '') {
$tmp = new $rawType($value);
$value = $tmp->setTimezone(new DateTimeZone(date_default_timezone_get()));
return true;

} elseif (ctype_digit($value)) {
$value = new $rawType("@{$value}");
return true;
}

} else {
if ($value instanceof $type) {
return true;
Expand Down

0 comments on commit 88f4476

Please sign in to comment.