diff --git a/src/Symfony/Component/Uid/AbstractUid.php b/src/Symfony/Component/Uid/AbstractUid.php index 142234118b3e..fa35031eaa78 100644 --- a/src/Symfony/Component/Uid/AbstractUid.php +++ b/src/Symfony/Component/Uid/AbstractUid.php @@ -11,6 +11,8 @@ namespace Symfony\Component\Uid; +use Symfony\Component\Uid\Exception\InvalidArgumentException; + /** * @author Nicolas Grekas
*/
@@ -29,41 +31,41 @@ abstract public static function isValid(string $uid): bool;
/**
* Creates an AbstractUid from an identifier represented in any of the supported formats.
*
- * @throws \InvalidArgumentException When the passed value is not valid
+ * @throws InvalidArgumentException When the passed value is not valid
*/
abstract public static function fromString(string $uid): static;
/**
- * @throws \InvalidArgumentException When the passed value is not valid
+ * @throws InvalidArgumentException When the passed value is not valid
*/
public static function fromBinary(string $uid): static
{
if (16 !== \strlen($uid)) {
- throw new \InvalidArgumentException('Invalid binary uid provided.');
+ throw new InvalidArgumentException('Invalid binary uid provided.');
}
return static::fromString($uid);
}
/**
- * @throws \InvalidArgumentException When the passed value is not valid
+ * @throws InvalidArgumentException When the passed value is not valid
*/
public static function fromBase58(string $uid): static
{
if (22 !== \strlen($uid)) {
- throw new \InvalidArgumentException('Invalid base-58 uid provided.');
+ throw new InvalidArgumentException('Invalid base-58 uid provided.');
}
return static::fromString($uid);
}
/**
- * @throws \InvalidArgumentException When the passed value is not valid
+ * @throws InvalidArgumentException When the passed value is not valid
*/
public static function fromBase32(string $uid): static
{
if (26 !== \strlen($uid)) {
- throw new \InvalidArgumentException('Invalid base-32 uid provided.');
+ throw new InvalidArgumentException('Invalid base-32 uid provided.');
}
return static::fromString($uid);
@@ -72,12 +74,12 @@ public static function fromBase32(string $uid): static
/**
* @param string $uid A valid RFC 9562/4122 uid
*
- * @throws \InvalidArgumentException When the passed value is not valid
+ * @throws InvalidArgumentException When the passed value is not valid
*/
public static function fromRfc4122(string $uid): static
{
if (36 !== \strlen($uid)) {
- throw new \InvalidArgumentException('Invalid RFC4122 uid provided.');
+ throw new InvalidArgumentException('Invalid RFC4122 uid provided.');
}
return static::fromString($uid);
diff --git a/src/Symfony/Component/Uid/BinaryUtil.php b/src/Symfony/Component/Uid/BinaryUtil.php
index 1a469fc56829..7d1e524e5e43 100644
--- a/src/Symfony/Component/Uid/BinaryUtil.php
+++ b/src/Symfony/Component/Uid/BinaryUtil.php
@@ -11,6 +11,8 @@
namespace Symfony\Component\Uid;
+use Symfony\Component\Uid\Exception\InvalidArgumentException;
+
/**
* @internal
*
@@ -162,7 +164,7 @@ public static function dateTimeToHex(\DateTimeInterface $time): string
{
if (\PHP_INT_SIZE >= 8) {
if (-self::TIME_OFFSET_INT > $time = (int) $time->format('Uu0')) {
- throw new \InvalidArgumentException('The given UUID date cannot be earlier than 1582-10-15.');
+ throw new InvalidArgumentException('The given UUID date cannot be earlier than 1582-10-15.');
}
return str_pad(dechex(self::TIME_OFFSET_INT + $time), 16, '0', \STR_PAD_LEFT);
@@ -171,7 +173,7 @@ public static function dateTimeToHex(\DateTimeInterface $time): string
$time = $time->format('Uu0');
$negative = '-' === $time[0];
if ($negative && self::TIME_OFFSET_INT < $time = substr($time, 1)) {
- throw new \InvalidArgumentException('The given UUID date cannot be earlier than 1582-10-15.');
+ throw new InvalidArgumentException('The given UUID date cannot be earlier than 1582-10-15.');
}
$time = self::fromBase($time, self::BASE10);
$time = str_pad($time, 8, "\0", \STR_PAD_LEFT);
diff --git a/src/Symfony/Component/Uid/CHANGELOG.md b/src/Symfony/Component/Uid/CHANGELOG.md
index f53899b6061c..31291948419c 100644
--- a/src/Symfony/Component/Uid/CHANGELOG.md
+++ b/src/Symfony/Component/Uid/CHANGELOG.md
@@ -1,6 +1,11 @@
CHANGELOG
=========
+7.3
+---
+
+ * Add component-specific exception hierarchy
+
7.2
---
diff --git a/src/Symfony/Component/Uid/Command/GenerateUuidCommand.php b/src/Symfony/Component/Uid/Command/GenerateUuidCommand.php
index 2117eb753e30..cd99acdd34cf 100644
--- a/src/Symfony/Component/Uid/Command/GenerateUuidCommand.php
+++ b/src/Symfony/Component/Uid/Command/GenerateUuidCommand.php
@@ -20,6 +20,7 @@
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
+use Symfony\Component\Uid\Exception\LogicException;
use Symfony\Component\Uid\Factory\UuidFactory;
use Symfony\Component\Uid\Uuid;
@@ -146,7 +147,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int
$create = function () use ($namespace, $name): Uuid {
try {
$factory = $this->factory->nameBased($namespace);
- } catch (\LogicException) {
+ } catch (LogicException) {
throw new \InvalidArgumentException('Missing namespace: use the "--namespace" option or configure a default namespace in the underlying factory.');
}
diff --git a/src/Symfony/Component/Uid/Exception/InvalidArgumentException.php b/src/Symfony/Component/Uid/Exception/InvalidArgumentException.php
new file mode 100644
index 000000000000..c28737bea8b2
--- /dev/null
+++ b/src/Symfony/Component/Uid/Exception/InvalidArgumentException.php
@@ -0,0 +1,16 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Uid\Exception;
+
+class InvalidArgumentException extends \InvalidArgumentException
+{
+}
diff --git a/src/Symfony/Component/Uid/Exception/InvalidUlidException.php b/src/Symfony/Component/Uid/Exception/InvalidUlidException.php
new file mode 100644
index 000000000000..cfb42ac5867a
--- /dev/null
+++ b/src/Symfony/Component/Uid/Exception/InvalidUlidException.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Uid\Exception;
+
+class InvalidUlidException extends InvalidArgumentException
+{
+ public function __construct(string $value)
+ {
+ parent::__construct(\sprintf('Invalid ULID: "%s".', $value));
+ }
+}
diff --git a/src/Symfony/Component/Uid/Exception/InvalidUuidException.php b/src/Symfony/Component/Uid/Exception/InvalidUuidException.php
new file mode 100644
index 000000000000..97009412b9c6
--- /dev/null
+++ b/src/Symfony/Component/Uid/Exception/InvalidUuidException.php
@@ -0,0 +1,22 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Uid\Exception;
+
+class InvalidUuidException extends InvalidArgumentException
+{
+ public function __construct(
+ public readonly int $type,
+ string $value,
+ ) {
+ parent::__construct(\sprintf('Invalid UUID%s: "%s".', $type ? 'v'.$type : '', $value));
+ }
+}
diff --git a/src/Symfony/Component/Uid/Exception/LogicException.php b/src/Symfony/Component/Uid/Exception/LogicException.php
new file mode 100644
index 000000000000..2f0f6927cae1
--- /dev/null
+++ b/src/Symfony/Component/Uid/Exception/LogicException.php
@@ -0,0 +1,16 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Uid\Exception;
+
+class LogicException extends \LogicException
+{
+}
diff --git a/src/Symfony/Component/Uid/Factory/UuidFactory.php b/src/Symfony/Component/Uid/Factory/UuidFactory.php
index f95082d2c8b3..2469ab9fdc27 100644
--- a/src/Symfony/Component/Uid/Factory/UuidFactory.php
+++ b/src/Symfony/Component/Uid/Factory/UuidFactory.php
@@ -11,6 +11,7 @@
namespace Symfony\Component\Uid\Factory;
+use Symfony\Component\Uid\Exception\LogicException;
use Symfony\Component\Uid\Uuid;
use Symfony\Component\Uid\UuidV1;
use Symfony\Component\Uid\UuidV4;
@@ -67,12 +68,15 @@ public function timeBased(Uuid|string|null $node = null): TimeBasedUuidFactory
return new TimeBasedUuidFactory($this->timeBasedClass, $node);
}
+ /**
+ * @throws LogicException When no namespace is defined
+ */
public function nameBased(Uuid|string|null $namespace = null): NameBasedUuidFactory
{
$namespace ??= $this->nameBasedNamespace;
if (null === $namespace) {
- throw new \LogicException(\sprintf('A namespace should be defined when using "%s()".', __METHOD__));
+ throw new LogicException(\sprintf('A namespace should be defined when using "%s()".', __METHOD__));
}
return new NameBasedUuidFactory($this->nameBasedClass, $this->getNamespace($namespace));
diff --git a/src/Symfony/Component/Uid/Tests/Factory/UlidFactoryTest.php b/src/Symfony/Component/Uid/Tests/Factory/UlidFactoryTest.php
index 5f86f736f32d..3f2c493f57b9 100644
--- a/src/Symfony/Component/Uid/Tests/Factory/UlidFactoryTest.php
+++ b/src/Symfony/Component/Uid/Tests/Factory/UlidFactoryTest.php
@@ -12,6 +12,7 @@
namespace Symfony\Component\Uid\Tests\Factory;
use PHPUnit\Framework\TestCase;
+use Symfony\Component\Uid\Exception\InvalidArgumentException;
use Symfony\Component\Uid\Factory\UlidFactory;
final class UlidFactoryTest extends TestCase
@@ -36,7 +37,7 @@ public function testCreate()
public function testCreateWithInvalidTimestamp()
{
- $this->expectException(\InvalidArgumentException::class);
+ $this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('The timestamp must be positive.');
(new UlidFactory())->create(new \DateTimeImmutable('@-1000'));
diff --git a/src/Symfony/Component/Uid/Tests/Factory/UuidFactoryTest.php b/src/Symfony/Component/Uid/Tests/Factory/UuidFactoryTest.php
index 259a84a3fe37..bd3e87fcddf0 100644
--- a/src/Symfony/Component/Uid/Tests/Factory/UuidFactoryTest.php
+++ b/src/Symfony/Component/Uid/Tests/Factory/UuidFactoryTest.php
@@ -12,6 +12,7 @@
namespace Symfony\Component\Uid\Tests\Factory;
use PHPUnit\Framework\TestCase;
+use Symfony\Component\Uid\Exception\InvalidArgumentException;
use Symfony\Component\Uid\Factory\UuidFactory;
use Symfony\Component\Uid\NilUuid;
use Symfony\Component\Uid\Uuid;
@@ -81,7 +82,7 @@ public function testCreateTimed()
public function testInvalidCreateTimed()
{
- $this->expectException(\InvalidArgumentException::class);
+ $this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('The given UUID date cannot be earlier than 1582-10-15.');
(new UuidFactory())->timeBased()->create(new \DateTimeImmutable('@-12219292800.001000'));
diff --git a/src/Symfony/Component/Uid/Tests/UlidTest.php b/src/Symfony/Component/Uid/Tests/UlidTest.php
index 338b699159a7..fe1e15b4cedd 100644
--- a/src/Symfony/Component/Uid/Tests/UlidTest.php
+++ b/src/Symfony/Component/Uid/Tests/UlidTest.php
@@ -12,6 +12,8 @@
namespace Symfony\Component\Uid\Tests;
use PHPUnit\Framework\TestCase;
+use Symfony\Component\Uid\Exception\InvalidArgumentException;
+use Symfony\Component\Uid\Exception\InvalidUlidException;
use Symfony\Component\Uid\MaxUlid;
use Symfony\Component\Uid\NilUlid;
use Symfony\Component\Uid\Tests\Fixtures\CustomUlid;
@@ -41,7 +43,7 @@ public function testGenerate()
public function testWithInvalidUlid()
{
- $this->expectException(\InvalidArgumentException::class);
+ $this->expectException(InvalidUlidException::class);
$this->expectExceptionMessage('Invalid ULID: "this is not a ulid".');
new Ulid('this is not a ulid');
@@ -151,7 +153,7 @@ public function testFromBinary()
*/
public function testFromBinaryInvalidFormat(string $ulid)
{
- $this->expectException(\InvalidArgumentException::class);
+ $this->expectException(InvalidArgumentException::class);
Ulid::fromBinary($ulid);
}
@@ -178,7 +180,7 @@ public function testFromBase58()
*/
public function testFromBase58InvalidFormat(string $ulid)
{
- $this->expectException(\InvalidArgumentException::class);
+ $this->expectException(InvalidArgumentException::class);
Ulid::fromBase58($ulid);
}
@@ -205,7 +207,7 @@ public function testFromBase32()
*/
public function testFromBase32InvalidFormat(string $ulid)
{
- $this->expectException(\InvalidArgumentException::class);
+ $this->expectException(InvalidArgumentException::class);
Ulid::fromBase32($ulid);
}
@@ -232,7 +234,7 @@ public function testFromRfc4122()
*/
public function testFromRfc4122InvalidFormat(string $ulid)
{
- $this->expectException(\InvalidArgumentException::class);
+ $this->expectException(InvalidArgumentException::class);
Ulid::fromRfc4122($ulid);
}
diff --git a/src/Symfony/Component/Uid/Tests/UuidTest.php b/src/Symfony/Component/Uid/Tests/UuidTest.php
index 5dfdc6d7c1dd..b6986b09ebaa 100644
--- a/src/Symfony/Component/Uid/Tests/UuidTest.php
+++ b/src/Symfony/Component/Uid/Tests/UuidTest.php
@@ -12,6 +12,7 @@
namespace Symfony\Component\Uid\Tests;
use PHPUnit\Framework\TestCase;
+use Symfony\Component\Uid\Exception\InvalidArgumentException;
use Symfony\Component\Uid\MaxUuid;
use Symfony\Component\Uid\NilUuid;
use Symfony\Component\Uid\Tests\Fixtures\CustomUuid;
@@ -35,7 +36,7 @@ class UuidTest extends TestCase
*/
public function testConstructorWithInvalidUuid(string $uuid)
{
- $this->expectException(\InvalidArgumentException::class);
+ $this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('Invalid UUID: "'.$uuid.'".');
Uuid::fromString($uuid);
@@ -58,7 +59,7 @@ public function testInvalidVariant(string $uuid)
$uuid = (string) $uuid;
$class = Uuid::class.'V'.$uuid[14];
- $this->expectException(\InvalidArgumentException::class);
+ $this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('Invalid UUIDv'.$uuid[14].': "'.$uuid.'".');
new $class($uuid);
@@ -381,7 +382,7 @@ public function testFromBinary()
*/
public function testFromBinaryInvalidFormat(string $ulid)
{
- $this->expectException(\InvalidArgumentException::class);
+ $this->expectException(InvalidArgumentException::class);
Uuid::fromBinary($ulid);
}
@@ -408,7 +409,7 @@ public function testFromBase58()
*/
public function testFromBase58InvalidFormat(string $ulid)
{
- $this->expectException(\InvalidArgumentException::class);
+ $this->expectException(InvalidArgumentException::class);
Uuid::fromBase58($ulid);
}
@@ -435,7 +436,7 @@ public function testFromBase32()
*/
public function testFromBase32InvalidFormat(string $ulid)
{
- $this->expectException(\InvalidArgumentException::class);
+ $this->expectException(InvalidArgumentException::class);
Uuid::fromBase32($ulid);
}
@@ -462,7 +463,7 @@ public function testFromRfc4122()
*/
public function testFromRfc4122InvalidFormat(string $ulid)
{
- $this->expectException(\InvalidArgumentException::class);
+ $this->expectException(InvalidArgumentException::class);
Uuid::fromRfc4122($ulid);
}
@@ -509,7 +510,7 @@ public function testV1ToV6()
public function testV1ToV7BeforeUnixEpochThrows()
{
- $this->expectException(\InvalidArgumentException::class);
+ $this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('Cannot convert UUID to v7: its timestamp is before the Unix epoch.');
(new UuidV1('9aba8000-ff00-11b0-b3db-3b3fc83afdfc'))->toV7(); // Timestamp is 1969-01-01 00:00:00.0000000
diff --git a/src/Symfony/Component/Uid/Ulid.php b/src/Symfony/Component/Uid/Ulid.php
index 1240b019e28e..9170d429b0eb 100644
--- a/src/Symfony/Component/Uid/Ulid.php
+++ b/src/Symfony/Component/Uid/Ulid.php
@@ -11,6 +11,9 @@
namespace Symfony\Component\Uid;
+use Symfony\Component\Uid\Exception\InvalidArgumentException;
+use Symfony\Component\Uid\Exception\InvalidUlidException;
+
/**
* A ULID is lexicographically sortable and contains a 48-bit timestamp and 80-bit of crypto-random entropy.
*
@@ -36,7 +39,7 @@ public function __construct(?string $ulid = null)
$this->uid = $ulid;
} else {
if (!self::isValid($ulid)) {
- throw new \InvalidArgumentException(\sprintf('Invalid ULID: "%s".', $ulid));
+ throw new InvalidUlidException($ulid);
}
$this->uid = strtoupper($ulid);
@@ -154,7 +157,7 @@ public static function generate(?\DateTimeInterface $time = null): string
$time = microtime(false);
$time = substr($time, 11).substr($time, 2, 3);
} elseif (0 > $time = $time->format('Uv')) {
- throw new \InvalidArgumentException('The timestamp must be positive.');
+ throw new InvalidArgumentException('The timestamp must be positive.');
}
if ($time > self::$time || (null !== $mtime && $time !== self::$time)) {
diff --git a/src/Symfony/Component/Uid/Uuid.php b/src/Symfony/Component/Uid/Uuid.php
index c956156a3d58..66717f2ca1d2 100644
--- a/src/Symfony/Component/Uid/Uuid.php
+++ b/src/Symfony/Component/Uid/Uuid.php
@@ -11,6 +11,8 @@
namespace Symfony\Component\Uid;
+use Symfony\Component\Uid\Exception\InvalidUuidException;
+
/**
* @author Grégoire Pineau