Ни первое, ни второе.
0. SQL запросу ну вот ни как не место в аргументах, это то, что должен делать ваш insert метод. Все что он должен получать - это аргументы которые будут вставляться в ваш запрос!
1. Вы не проверяете аргументы. Что произойдет, если я вызову insert:
$db->insert(new \Exception(), []);
Или так
$db->insert("DELETE FROM user", []);
Или так (тут lastInsertId вернет не id вставки)
$db->insert("SELECT CURRENT_TIMESTAMP", []);
2. Никогда, слышите? НИКОГДА! Не используйте при работе с БД суперглобальные переменные. Их удел - в самом начале index.php собрать объект Request, далее про их существование можно забыть.
3. datab обычно называются connection, либо по типу класса
4. В следующем коде нет смысла, от слова "совсем"
}catch(PDOException $e){
                throw new Exception($e->getMessage());
Вы просто обрубаете стектрейс, который далее стоит использовать для поиска ошибок.
5. У вас ключи строковые, зачем вот это?
unset($arr[$key + 1]);
6. Если в params передать [[]], как себя поведет ":$key"?
7. lastInsertId возвращает строку, кастовать в ваш тип не помешает.
8. Ради всего святого: 
прочитайте и следуйте PSR
Вот вам пример безопасного кода. Проверок в реальном коде должно быть на много больше:
* логин стоит прогнать по регулярке на допустимые символы
* почту стоит прогнать по регулярке, или через filter_var
* что пароль таки хэш (смотря какой алгоритм используете)
* если будут еще поля не строковых типов - их подключаем через bindValue с указанием типа
Тут сделано допущение, что подключение PDO уже настроен на бросание ошибок. В задачи репозитория не входит конфигурирование коннекшна.
По хорошему это дело еще и в транзакцию обернуть.
<?php
declare(strict_types = 1);
class UserRepository
{
    /** @var \PDO */
    private $pdo;
    /**
     * @param PDO $pdo
     */
    public function __construct(\PDO $pdo)
    {
        $this->pdo = $pdo;
    }
    /**
     * @param string $login
     * @param string $email
     * @param string $password
     * @return int
     * @throws \InvalidArgumentException
     * @throws \PDOException
     */
    public function insert(string $login, string $email, string $password): int
    {
        if (empty($login)) {
            throw new \InvalidArgumentException('Argument "$login" must be not empty');
        } elseif (empty($email)) {
            throw new \InvalidArgumentException('Argument "$email" must be not empty');
        } elseif (empty($password)) {
            throw new \InvalidArgumentException('Argument "$password" must be not empty');
        }
        $sql = '
        INSERT INTO `user`(
            `login`,
            `email`,
            `password`
        ) VALUES (
            :login,
            :email,
            :password
        )';
        $this->pdo->prepare($sql)->execute(
            [
                ':login' => $login,
                ':email' => $email,
                ':password' => $password
            ]
        );
        
        return (int) $this->pdo->lastInsertId();
    }
}