Упрощение кода Скотта выше, удалив ненужные циклы, которые сильно замедляются и не делают его более безопасным, чем вызов openssl_random_pseudo_bytes только один раз
function crypto_rand_secure($min, $max)
{
$range = $max - $min;
if ($range < 1) return $min; // not so random...
$log = ceil(log($range, 2));
$bytes = (int) ($log / 8) + 1; // length in bytes
$rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
return $min + $rnd%$range;
}
function getToken($length)
{
return bin2hex(openssl_random_pseudo_bytes($length)
}
Вы не можете сделать это с шаблоном ввода формы по умолчанию. Вы можете настроить шаблон ввода формы, как показано ниже, чтобы добиться этого.
<?php
echo $this->Form->input('username', [
'label' => false,
'placeholder' => __('Username or email address'),
'class' => 'form-control',
'templates' => [
'inputContainer' => '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-user"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"></path><circle cx="12" cy="7" r="4"></circle></svg>{{content}}'
],
])
?>
Ссылка: Cakephp -> Form -> Настройка шаблонов, которые FormHelper использует