Это бессмысленно. Чем универсальнее будет ваш обработчик - тем сложнее будет им пользоваться. Что произойдет, когда данные будут отправляться в виде json например, а не url-кодированной строки?
Вместо этого рекомендую следующий подход
use Symfony\Component\HttpFoundation\Request;
class LoginForm
{
/** @var string */
private $login;
/** @var string */
private $password;
/**
* @param Request $request
*/
public function __construct(Request $request)
{
$login = $request->request->get('login');
$password = $request->request->get('password');
if (is_null($login)) {
throw new \InvalidArgumentException('Parameter "login" is required');
} elseif (!is_string($login)) {
throw new \InvalidArgumentException('Parameter "login" must be string');
} elseif (strlen($login) < 3) {
throw new \InvalidArgumentException('Length of parameter "login" must be greater than 3');
} elseif (strlen($login) > 64) {
throw new \InvalidArgumentException('Length of parameter "login" must be less than 64');
} elseif (preg_match('/^[a-z\d]+$/i', $login) === 0) {
throw new \InvalidArgumentException('Parameter "login" contain not allowed symbols');
}
if (is_null($password)) {
throw new \InvalidArgumentException('Parameter "password" is required');
} elseif (!is_string($password)) {
throw new \InvalidArgumentException('Parameter "password" must be string');
} elseif (strlen($password) < 6) {
throw new \InvalidArgumentException('Length of parameter "password" must be greater than 6');
}
$this->login = $login;
$this->password = $password;
}
/**
* @return string
*/
public function getLogin(): string
{
return $this->login;
}
/**
* @return string
*/
public function getPassword(): string
{
return $this->password;
}
}
Да, кода получается много, но вы гарантировано получаете корректные данные с помощью геттеров. Если нужно будет создавать некие DTO, или VO - прямо в конструкторе это можно сделать. Такой класс прост в тестировании и поддержке.