Другое

Как исправить ошибку getDoctrineConnection в Laravel 5.19

Как исправить ошибку «Method Illuminate\\Database\\MySqlConnection::getDoctrineConnection не существует» при выполнении php artisan migrate в Laravel 5.19. Установите doctrine/dbal и решение.

Как исправить ошибку «Method Illuminate\Database\MySqlConnection::getDoctrineConnection does not exist» при запуске php artisan migrate в Laravel 5.19?

Я сталкиваюсь с следующей BadMethodCallException, когда пытаюсь выполнить миграции в моём приложении Laravel 5.19:

BadMethodCallException

Method Illuminate\Database\MySqlConnection::getDoctrineConnection does not exist.

at vendor\laravel\framework\src\Illuminate\Macroable\Traits\Macroable.php:115
  111▕      */
  112public function __call($method, $parameters)
  113▕     {
  114if (! static::hasMacro($method)) {
  ➜ 115throw new BadMethodCallException(sprintf(
  116'Method %s::%s does not exist.', static::class, $method
  117▓             ));
  118▕         }
  119▕     }

  1   database\migrations\2019_04_01_103035_rename_datasource_account_id_engagement_id.php:22
      Illuminate\Database\Connection::__call("getDoctrineConnection", [])

  2   vendor\laravel\framework\src\Illuminate\Database\Migrations\Migrator.php:514
      RenameDatasourceAccountIdEngagementId::up()

Ошибка возникает конкретно в файле миграции database\migrations\2019_04_01_103035_rename_datasource_account_id_engagement_id.php на строке 22. Всё остальное в приложении работает корректно. Как я могу решить эту проблему и успешно запустить миграции?

Ошибка «Method Illuminate\Database\MySqlConnection::getDoctrineConnection does not exist» возникает, потому что ваше приложение Laravel 5.19 пытается использовать функциональность Doctrine DBAL без правильной установки или настройки необходимых зависимостей. Самое распространённое решение — установить пакет doctrine/dbal и убедиться, что файлы миграций корректно структурированы для системы миграций Laravel.

Содержание

Понимание ошибки

Метод getDoctrineConnection является частью интеграции Doctrine DBAL в Laravel, которая предоставляет дополнительные возможности работы с схемой базы данных, выходящие за рамки встроенной системы миграций Laravel. Когда вы видите эту ошибку, обычно это означает одну из трёх причин:

  1. Пакет doctrine/dbal не установлен в проекте.
  2. Пакет установлен, но не настроен должным образом.
  3. Файлы миграций вызывают методы Doctrine некорректно.

Из трассировки стека видно, что ошибка возникает в файле миграции database\migrations\2019_04_01_103035_rename_datasource_account_id_engagement_id.php на строке 22, где пытается вызвать getDoctrineConnection() у объекта соединения с базой данных.

Основное решение: установка Doctrine DBAL

Самый простой способ — установить пакет doctrine/dbal, который добавит недостающие методы:

bash
composer require doctrine/dbal

Эта команда установит Doctrine Database Abstraction Layer, включающий метод getDoctrineConnection(), необходимый классам соединения Laravel. Как отмечено в Stack Overflow, это самое распространённое решение для данной ошибки.

После установки выполните:

bash
composer dump-autoload

Это пересоберёт автозагрузчик вашего приложения и сделает классы Doctrine доступными.

Альтернативные решения

Если установка doctrine/dbal не решает проблему, рассмотрите следующие варианты:

Ручная регистрация макроса

Если вы не хотите использовать пакет doctrine/dbal, можно вручную зарегистрировать недостающий метод как макрос. Добавьте следующий код в AppServiceProvider или любой другой сервис‑провайдер:

php
use Illuminate\Support\Facades\Config;
use Illuminate\Database\Connection;
use Doctrine\DBAL\DriverManager;

// В методе boot() вашего провайдера
if (Config::get('database.default') === 'mysql' && !Connection::hasMacro('getDoctrineConnection')) {
    Connection::macro('getDoctrineConnection', function () {
        return DriverManager::getConnection([
            'pdo' => $this->getPdo(),
            'dbname' => $this->getDatabaseName(),
            'driver' => 'pdo_mysql',
            'user' => Config::get('database.connections.mysql.username'),
            'password' => Config::get('database.connections.mysql.password'),
            'host' => Config::get('database.connections.mysql.host'),
            'port' => Config::get('database.connections.mysql.port'),
            'charset' => Config::get('database.connections.mysql.charset', 'utf8mb4'),
        ]);
    });
}

Этот подход, описанный в статье Flavio H. Ferreira, вручную создаёт недостающий метод, конфигурируя соединение Doctrine DBAL.

Проверка версий пакетов

Убедитесь, что у вас совместимые версии Laravel и doctrine/dbal. Для Laravel 5.19 рекомендуется использовать doctrine/dbal версии ^2.6.0. Проверьте ваш composer.json и при необходимости скорректируйте ограничение версии:

json
"doctrine/dbal": "^2.6.0"

Проверка и исправление файлов миграций

Откройте файл миграции database\migrations\2019_04_01_103035_rename_datasource_account_id_engagement_id.php и посмотрите, как он использует методы Doctrine. Проблема может заключаться в реализации, а не в отсутствии метода.

Ниже пример того, как должна выглядеть миграция без использования Doctrine:

php
public function up()
{
    Schema::table('your_table_name', function (Blueprint $table) {
        // Стандартные операции схемы Laravel
        $table->renameColumn('old_column_name', 'new_column_name');
    });
}

public function down()
{
    Schema::table('your_table_name', function (Blueprint $table) {
        $table->renameColumn('new_column_name', 'old_column_name');
    });
}

Если миграция использует специфические операции Doctrine, такие как getDoctrineConnection(), рассмотрите возможность переписать её, используя встроенный билдера схемы Laravel. Фасад Schema предоставляет большинство необходимых функций без необходимости Doctrine.

Проблемы совместимости версий

Laravel 5.19 имеет специфические требования к интеграции с Doctrine. Как отмечено в GitHub issues, возникали проблемы совместимости между разными версиями Laravel и Doctrine DBAL.

Проверьте текущие версии:

bash
composer show doctrine/dbal

Убедитесь, что используете совместимую версию. Для Laravel 5.19 обычно рекомендуется doctrine/dbal ^2.6.0.

Если возникают проблемы, попробуйте указать более точную версию:

bash
composer require doctrine/dbal:^2.6.0

Полный набор шагов по устранению неполадок

  1. Установите Doctrine DBAL:

    bash
    composer require doctrine/dbal
    composer dump-autoload
    
  2. Очистите кэш конфигурации:

    bash
    php artisan config:clear
    php artisan cache:clear
    
  3. Проверьте файл миграции и убедитесь, что он использует корректные методы схемы Laravel.

  4. Проверьте composer.json на наличие правильного ограничения версии doctrine/dbal.

  5. Тестируйте миграцию:

    bash
    php artisan migrate
    
  6. Если проблема сохраняется, временно удалите миграционный файл и запустите миграции без него, чтобы изолировать проблему:

    bash
    php artisan migrate --step
    
  7. Проверьте наличие конфликтующих пакетов, которые могут переопределять методы соединения Laravel.

  8. Обновите все пакеты, если ничего не помогло:

    bash
    composer update
    

Заключение

Ошибка «Method Illuminate\Database\MySqlConnection::getDoctrineConnection does not exist» в Laravel 5.19 обычно устраняется установкой пакета doctrine/dbal. Это добавляет недостающую интеграцию Doctrine, которую система миграций Laravel ожидает при работе с операциями над схемой базы данных. Если установка пакета не решает проблему, проверьте файлы миграций на корректность синтаксиса Laravel, убедитесь в совместимости версий и при необходимости вручную зарегистрируйте недостающий макрос. Всегда следите за тем, чтобы зависимости были правильно установлены и актуальны, чтобы избежать подобных интеграционных ошибок.

Авторы
Проверено модерацией
Модерация