ldc-boutique-cnc-sable/domain/Models/ValueObjects/Slug.php
Jérémy Munsch a7354cb051
feat: Add StringEncoder and StringHelper for encoding utilities
- Introduced StringEncoder for converting various encodings to UTF-8.
- Added StringHelper with methods for string manipulation and transliteration.
2026-10-27 09:58:59 +01:00

38 lines
1 KiB
PHP

<?php
declare(strict_types=1);
namespace Domain\Models\ValueObjects;
use Shared\Helpers\StringHelper;
use Webmozart\Assert\Assert;
final readonly class Slug implements \Stringable
{
public function __construct(public string $value)
{
Assert::stringNotEmpty(trim($value), 'Slug cannot be empty.');
Assert::maxLength($value, 255, 'Slug cannot exceed 255 characters.');
Assert::regex($value, '/^[a-z0-9]+(?:-[a-z0-9]+)*$/', 'Slug format is invalid.');
}
public static function fromString(string $string): self
{
$cleanString = StringHelper::transliterate($string);
$slug = strtolower(trim($cleanString));
$slug = preg_replace('/[^a-z0-9]+/i', '-', $slug) ?? '';
$slug = trim($slug, '-');
$slug = preg_replace('/-+/', '-', $slug) ?? '';
Assert::stringNotEmpty($slug, 'Cannot generate a valid slug from given string.');
return new self($slug);
}
#[\Override]
public function __toString(): string
{
return $this->value;
}
}