Laravel: разные имена столбцов с разными именами пользователей - PullRequest
0 голосов
/ 21 января 2019

Мне нужно использовать таблицу q_users (users на чистом уровне) со столбцами: qID (id), qName (name), qEmail (email), qPass (password), qEmailVerifiedAt (email_verified_at). Как заставить их успешно использовать Laravel?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Чтобы изменить таблицу, вы можете сделать это на своей модели.

protected $table = 'q_users';

Чтобы изменить первичный ключ, вы можете сделать это: protected $ primaryKey = 'qID';

Чтобы изменить другие поля, такие как email, name, password, вы можете написать миграцию для переименования столбцов в таблице users.Это будет выглядеть следующим образом:

Schema::table('users', function (Blueprint $table) {
    $table->renameColumn('name', 'qName');
    $table->renameColumn('email', 'qEmail');
    $table->renameColumn('password', 'qPassword'); 
});

Прежде чем вы сможете это сделать, убедитесь, что у вас установлен пакет doctrine/dbal.Вы можете установить его, выполнив следующие действия:

composer require doctrine/dbal

Изменение поля email и password может иметь много последствий в системе аутентификации Laravel и системе уведомлений.Вам нужно сделать пару изменений.

В вашем App\Http\Controllers\Auth\LoginController вам нужно добавить следующий метод, который переопределит тот, который входит в черту AuthenticateUsers.

/**
 * Get the login username to be used by the controller.
 *
 * @return string
 */
public function username()
{
    return 'qEmail';
}

Вам также необходимо добавить следующий метод:

/**
 * Get the password for the user.
 *
 * @return string
 */
public function getAuthPassword()
{
    return $this->qPassword;
}

... и это должно обеспечить успешную работу входа в систему с вашими новыми полями.

Изменение электронной почты также может нарушить рабочий процесс сброса пароля электронной почты.Вам необходимо переопределить следующий метод в вашей модели пользователя.

/**
 * Get the e-mail address where password reset links are sent.
 *
 * @return string
 */
public function getEmailForPasswordReset()
{
    return $this->qEmail;
}

Я не совсем уверен, как вы можете переопределить рабочий процесс проверки, но похоже, что вам нужно будет внести изменения здесь:

/**
 * Determine if the user has verified their email address.
 *
 * @return bool
 */
public function hasVerifiedEmail()
{
    return ! is_null($this->qEmailVerifiedAt);
}

/**
 * Mark the given user's email as verified.
 *
 * @return bool
 */
public function markEmailAsVerified()
{
    return $this->forceFill([
        'qEmailVerifiedAt' => $this->freshTimestamp(),
    ])->save();
}

/**
 * Send the email verification notification.
 *
 * @return void
 */
public function sendEmailVerificationNotification()
{
    // You probably need to override with your own notification here
    // which would pull your actual email
    $this->notify(new Notifications\VerifyEmail);
}

В общем, этотрудное решение.Я не уверен, почему вы хотите это сделать.Однако, так как вы хотите это сделать, есть более простой (хотя все еще не рекомендуемый способ), чтобы гарантировать, что все хорошо работает с вашими новыми полями.

Вы можете определить Accessors к вашим измененным полям.Например, вы можете добавить следующие методы доступа в вашу модель User.

public function getNameAttribute($value)
{
    return $this->qName; 
}

public function getEmailAttribute($value)
{
    return $this->qEmail; 
}

public function getEmailVerifiedAtAttributes($value)
{
    return $this->qEmailVerifiedAt; 
}

... и это должно заставить его работать.Любые вызовы на $user->email фактически вытягивают значение из $user->qEmail.Хотя, как я уже сказал, я бы лично не рекомендовал это.

Редактировать: На основании ваших комментариев, если вы хотите изменить имя поля в форме входа в систему, вам также необходимо изменить логику проверки.Так что в вашем LoginController вам также необходимо переопределить эти методы.

/**
 * Validate the user login request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return void
 */
protected function validateLogin(Request $request)
{
    $this->validate($request, [
        $this->username() => 'required|string',
        'qPassword' => 'required|string',
    ]);
}

/**
 * Get the needed authorization credentials from the request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return array
 */
protected function credentials(Request $request)
{
    return $request->only($this->username(), 'qPassword');
}
0 голосов
/ 21 января 2019

В ваших моделях используйте следующие коды.

protected $table = 'q_users';
protected $primaryKey = 'qID' ;
protected $timestamps = false;//only if you don't use anything like created_at or updated_at. Otherwise use the two lines below.
const CREATED_AT = 'qcreated_at';
const UPDATED_AT = 'qupdated_at';

Вместо пользовательской таблицы по умолчанию в вашей /database/migrations вы можете создать q_users таблицу.

Если вам необходимо реализовать аутентификацию, измените таблицу и / или название модели соответственно в /config/auth.php.

Вам не нужно определять свое пользовательское поле qName или qPass в вашей модели. Обычно Ларавел не заботится об этом. Вы можете вручную подтвердить подлинность. (Я предпочитаю ручную аутентификацию для своих приложений.)

Если вы хотите использовать make:auth эшафот, вы можете изменить LoginController.php следующим образом:

public function username()
{
    return 'qEmail';
}

Для поля пароля вы можете определить его в вашей модели, например,

public function getAuthPassword()
{
    return $this->qPass;
}

О email_verified_at, насколько я знаю, его нельзя изменить без настройки фреймворка Laravel. В вашем /vendor/aravel/framework/src/Illuminate/Auth/MustVerifyEmail.php вы можете указать свое имя. Но это немного рискованно. Лучше всего реализовать свою собственную логику проверки. При необходимости вы можете реализовать интерфейс MustVerifyEmail.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...