webpatser/uuid
Pure PHP UUID generator/validator (RFC 4122 + RFC 9562). Create UUID v1, v3, v4, v5, v6, v7, v8 and nil UUIDs; import, validate, compare, and inspect string/hex/bytes/URN, version, variant, and time fields.
Installation:
composer require webpatser/uuid
Add to composer.json under require if using strict versioning.
First Use Case: Replace auto-increment IDs in a Laravel model with UUIDv7 for distributed databases:
use Webpatser\Uuid\Uuid;
class User extends Model {
protected $keyType = 'string';
public $incrementing = false;
protected $casts = ['id' => Uuid::class];
public static function boot() {
parent::boot();
static::creating(function ($model) {
$model->id = Uuid::v7();
});
}
}
Validation: Add a UUID validation rule in Laravel:
use Webpatser\Uuid\Uuid;
$request->validate([
'user_id' => ['required', function ($attribute, $value, $fail) {
if (!Uuid::validate($value)) {
$fail('The '.$attribute.' must be a valid UUID.');
}
}]
]);
Uuid::v4() (random) or Uuid::v7() (time-ordered) for 90% of use cases.generate(), import(), validate(), and compare() methods.importFromSqlServer() and toSqlServer() if migrating from legacy systems.php examples/benchmark.php 10000 to compare UUID versions in your environment.| Use Case | Pattern | Example |
|---|---|---|
| General-purpose IDs | Uuid::v4() |
$id = Uuid::v4(); |
| Database IDs | Uuid::v7() (time-ordered) |
$id = Uuid::v7(); |
| Deterministic IDs | Uuid::generate(5, 'name', NS_DNS) |
Name-based UUIDs for caching keys. |
| Legacy Compatibility | Uuid::generate(1) |
Time-based with MAC (avoid for new apps). |
| SQL Server | Uuid::importFromSqlServer() |
Handle mixed-endianness GUIDs. |
use Webpatser\Uuid\Uuid;
class Post extends Model {
protected $keyType = 'string';
public $incrementing = false;
protected $casts = ['id' => Uuid::class];
protected static function boot() {
parent::boot();
static::creating(function ($model) {
$model->id = Uuid::v7(); // Time-ordered for databases
});
}
public function getRouteKey() {
return $this->id->string;
}
}
use Webpatser\Uuid\Uuid;
$request->validate([
'uuid_field' => [
'required',
function ($attribute, $value, $fail) {
if (!Uuid::validate($value)) {
$fail('Invalid UUID format.');
}
}
]
]);
// Or use Laravel's built-in UUID cast (if using Laravel 10+)
$request->validate(['uuid_field' => 'uuid']);
UUIDv7 for time-ordered indexing.
CREATE INDEX idx_posts_created_at ON posts (id::uuid); -- PostgreSQL
CREATE INDEX idx_posts_created_at ON posts (HEX(id)); -- MySQL 8.0+
importFromSqlServer() for existing uniqueidentifier columns.
$sqlGuid = '825B076B-44EC-E511-80DC-00155D0ABC54';
$uuid = Uuid::importFromSqlServer($sqlGuid);
use Webpatser\Uuid\Uuid;
public function test_uuid_generation() {
$uuid = Uuid::v4();
$this->assertTrue(Uuid::validate($uuid->string));
$this->assertEquals(4, $uuid->version);
}
public function test_uuid_comparison() {
$uuid1 = Uuid::v7();
$uuid2 = Uuid::import($uuid1->string);
$this->assertTrue(Uuid::compare($uuid1->string, $uuid2->string));
}
// Benchmark UUIDv7 generation (run once per environment)
$result = Uuid::benchmark(10000, 7);
dd($result); // [version, iterations, total_time_ms, avg_time_us, memory_used_bytes, uuids_per_second]
Laravel Scout:
UUIDv7 is searchable but requires string casting. Override toSearchableArray():
public function toSearchableArray() {
return [
'id' => $this->id->string,
'title' => $this->title,
// ...
];
}
API Keys/Tokens: Use UUIDv4 for cryptographically secure tokens:
$token = Uuid::v4()->string;
Cache::put("api_token_{$user->id}", $token, now()->addDays(30));
Migration from Incrementing IDs:
Uuid::generate(8) (custom) for vendor-specific migrations.User::chunk(1000, function ($users) {
foreach ($users as $user) {
$user->uuid = Uuid::v7();
}
User::whereIn('id', $users->pluck('id'))->update(['uuid' => \DB::raw('uuid'));
});
Caching Keys: Use UUIDv5 for deterministic cache keys:
$cacheKey = Uuid::generate(5, "user:{$user->email}", Uuid::NS_DNS)->string;
Cache::put($cacheKey, $userData, now()->addHours(1));
Event Dispatching: Use UUIDv7 for event IDs to ensure chronological ordering:
event(new UserRegistered(
userId: Uuid::v7(),
user: $user
));
PHP 8.5 Requirement:
ramsey/uuid instead.UUIDv1 MAC Address Dependency:
SQL Server Endianness:
importFromSqlServer() and toSqlServer():
$uuid = Uuid::importFromSqlServer($sqlGuid); // Correctly converts endianness
UUIDv7 Time Precision:
$result = Uuid::benchmark(100000, 7);
if ($result['uuids_per_second'] > 100000) {
// Consider UUIDv4 for high-throughput systems
}
Nil UUID Handling:
Uuid::nil() returns a UUID of all zeros (00000000-0000-0000-0000-000000000000).
Uuid::isNilUuid($uuid) to validate before insertion.Case Sensitivity:
How can I help you explore Laravel packages today?