Ваши "ключи" слишком просты, вы можете получить дубликаты. Если возможно, просто используйте первичный ключ (id) домена / проекта / задачи. В этом случае вам, вероятно, больше не нужно свойство $url
в этих трех объектах.
Но поскольку вы пытались придумать более сложную схему, я полагаю, вы хотите, чтобы эти URL-адреса были доступны для анонимных пользователей. пользователи, не делая их доступными для всех, кто пытается случайные идентификаторы в URL. Если это то, что вы пытаетесь достичь, попробуйте использовать случайные строки вместо случайных целых чисел. Вот пример генерации случайной строки, которая на самом деле используется Symfony для генерации безопасных токенов:
$entropy = 128;
$bytes = random_bytes($entropy / 8);
$randomString = rtrim(strtr(base64_encode($bytes), '+/', '-_'), '=');
Возвращает криптографически безопасную псевдослучайную строку с безопасной кодировкой base64, которая не содержит "+",«/» или «=», которые должны быть закодированы в URL. Длина строки составляет ceil($entropy / 6)
.
Если вам действительно нужно использовать ключи int, rand()
не является криптографически безопасным (то есть не таким случайным, как хотелось бы), используйте random_int() вместо.
В любом случае, убедитесь, что вы не получаете дублирующихся записей и установите для этих полей url
значение unique
в вашей базе данных. Если ваши «ключи» не очень длинные или если вы хотите обработать случай «один на миллиард» и избежать исключения из базы данных, вы также можете вручную проверять наличие дубликатов при генерации случайного «URL» (возможно, с помощью findOneBy()
) и сгенерируйте еще один «url», если совпадение найдено (например, выполните генерацию + проверку в цикле while
и разорвите цикл, если совпадение не найдено, тогда setUrl($randomUrl)
)