Как перенести старую базу данных MySQL в проект Laravel?

Я пытаюсь перенести старый проект PHP/MySQL в Laravel. По многим причинам я не должен изменять схему таблицы базы данных. Мне нужно изменить классы фреймворка Laravel. Например, я хочу заставить Laravel Auth проверять столбец users.USER, чтобы вернуть пользователя, а не users.user. Мне нужно знать, какая часть фреймворка Laravel проверяет users таблицу базы данных или user столбец. Как изменить без перерыва функциональность аутентификации по умолчанию.

Более конкретно: я хочу знать, как Laravel извлекает данные из базы данных в /Vendor/laravel/framework/src/illuminate/Auth/EloquentUserProvider.php строке 137 validateCredentials().

Почему бы вам не написать скрипты миграции? например, вы можете перенести столбец users.USER в users.user в своем скрипте миграции.

Iftikhar uddin 25.02.2019 20:28
stackoverflow.com/a/33889923/823549
1000Nettles 25.02.2019 20:29

Вы также можете использовать пользовательскую модель для аутентификации, то есть таблицу, отличную от users. Подробнее см. в сообщении это.

Mihir Bhende 25.02.2019 20:32

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

Johhn 25.02.2019 20:37

@john Моя цель — заставить Laravel Auth использовать мой столбец users.USER вместо проверки таблицы users.user. Я не хочу менять схему таблицы.

Jeff 25.02.2019 20:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
2 212
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Например.

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class User extends Model{
    protected $table = 'users.USER';
}

Вопрос/ответ, связанный с базой данных:

Для извлечения моделей из схемы базы данных вы можете использовать следующий пакет:

Релиз/Ларавел

Этот пакет позволяет автоматически генерировать модели Eloquent, необходимые для начала работы с вашей базой данных в Laravel.

Он имеет множество простых в использовании команд, позволяющих создавать модели из вашей схемы базы данных.

использование

Давайте создадим некоторые из ваших моделей из вашего соединения по умолчанию.

php artisan code:models

Вы можете построить конкретную таблицу следующим образом:

php artisan code:models --table=users

Вы также можете указать соединение:

php artisan code:models --connection=mysql

Если вы используете базу данных MySQL, вы можете указать, какую схему вы хотите создать:

php artisan code:models --schema=shop

Расширение/редактирование функций аутентификации

Взгляните на официальную документацию по ручная аутентификация.

Если вы поместите следующий фрагмент в свой контроллер:

public function authenticate(Request $request)
{
    $credentials = $request->only('email', 'password');

    if (Auth::attempt($credentials)) {
        // Authentication passed...
        return redirect()->intended('dashboard');
    }
}

Если вам нужно указать, какие свойства использовать, вы можете использовать следующее:

if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
  // The user is active, not suspended, and exists.
}

Вы также можете просто выполнить собственную проверку, а затем войти в свой код напрямую, используя следующий код:

Auth::login($user);

// Login and "remember" the given user...
Auth::login($user, true);

Все, что я перечислил здесь, находится в ссылке выше об аутентификации пользователей.

Ответ принят как подходящий

Рекомендации по базе данных

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

Подробнее здесь Определение моделей

Аутентификация с пользовательскими полями и полями пароля

Если вы запустили команду php artisan make:auth, но хотите использовать другую таблицу или поля вместо пользователя по умолчанию и пройти без нарушения созданной функции аутентификации, вы должны сделать так, чтобы laravel узнал об этом, выполнив шаги, перечисленные ниже:

Первый: Создайте модель для таблицы, которую вы хотите использовать для аутентификации. Для этого выполните команду php artisan make:model FooUserTable, где «FooUser» — имя вашей таблицы.

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

class FooUser extends Authenticatable{

    protected $table = 'FooUser';
    protected $primaryKey = 'foo_id_user'; // Place here the name of the id of your table
    protected $fillable = [ // Insert here all the fillable fields of your users table
        'field1',
        'field2',
        ...
    ];

}

Обратите внимание, что модель теперь расширяется от Authenticatable, а не от модели, которая является псевдонимом для класса Illuminate\Foundation\Auth\User. Чтобы это заработало, просто поставьте use Illuminate\Foundation\Auth\User as Authenticatable вверху файла.

Это важно!:

Чтобы использовать другое имя поля для пароля, поместите функцию getAuthPassword в модель для вашей таблицы пользователей, как показано ниже:

public function getAuthPassword(){
    return $this->myPasswordField; // myPasswordField is the field on your users table for password
}

Теперь у вас есть вся ваша модель, готовая к следующему шагу.

Второй: В файле config > auth.php вам нужно найти массив провайдеров и изменить значение свойства модели на имя класса вашей модели, например:

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\FooUser::class, // Place here the name of your model
    ],
],

Все готово для следующего шага.

Третий: Теперь вам нужно найти контроллер для Laravel Auth по умолчанию, расположенный в app > http > controllers > auth > LoginController.php, и в класс, вам нужно только добавить функцию с именем username, которая возвращает имя пользователя, которое будет использоваться для действия аутентификации, как показано ниже:

class LoginController extends Controller{

    ..... // don't change other functions

    public function username(){ // add the function username
        return 'YourUsernameField';
    }

}

Примечание к шаблону входа в Blade: В шаблоне блейда входа в систему вы должны изменить имя ввода имени пользователя на новое, а имя поля пароля должно быть по-прежнему password, потому что laravel использует его для проверки, но внутри он будет использовать ваше пользовательское имя поля пароля.

И это все. Я надеюсь, это поможет вам.

Примечание: Никогда не редактируйте файлы в папке поставщика!

Подробнее читайте в документации по разделу Ручная аутентификация пользователей

Все это тестировалось на версиях Laravel 5.4 и 5.7.

Я лично думаю, что это излишество по сравнению с тем, чего он пытается достичь. Но это очень хорошо структурированный и подробный ответ. Это также больше ответ на вопрос о том, как правильно расширяться.

Kerel 27.02.2019 14:25

Другие вопросы по теме