Миграция ошибок: невозможно объявить класс X, так как имя уже используется

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

Миграции:

2014_10_12_100000_create_password_resets_table.php
2019_01_18_020910_create_roles_table.php
2019_01_18_025535_create_members_table.php
2019_01_18_025536_create_users_table.php
2019_01_18_183649_create_projects_table.php
2019_01_18_184249_create_member_project_table.php
2019_01_18_184719_create_sprints_table.php
2019_01_18_185218_create_tasks_table.php
2019_01_21_033045_add_shortname_to_project.php

Ошибка:

PHP Fatal error:  Cannot declare class CreateRolesTable, because the name is already in use in
oyectos\database\migrations\2019_01_18_020910_create_roles_table.php on line 33

In 2019_01_18_020910_create_roles_table.php line 33:

  Cannot declare class CreateRolesTable, because the name is already in use

Класс:

class CreateRolesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('roles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name',128)->unique();
            $table->string('description');
            $table->boolean('system');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('roles');
    }
}

Вы проверили все имена классов? Они не обязательно совпадают с именами файлов.

Jerodev 19.02.2019 12:55

Да все классы разные

Federico Fia Sare 19.02.2019 12:57

это конец урока с замком "}"

Federico Fia Sare 19.02.2019 13:19

композитор дамп-автозагрузка

mercury 04.01.2022 15:39
Стоит ли изучать 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 и хотите разрабатывать...
39
4
33 047
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

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

Первое решение:

Похоже, у вас есть две миграции, выполненные в разное время с практически одинаковым именем.

например: 2019_01_18_020910_create_roles_table.php

и 2019_01_16_020910_create_roles_table.php

Laravel преобразует это имя файла, удалив подпись даты и оставшийся текст в верблюжьем регистре.

Таким образом, обе эти миграции будут иметь класс CreateRolesTable, даже если размеры различны. Проверьте, есть ли в вашем каталоге миграции такие 2 файла.

Чтобы проверить это, запустите это из терминала в корне проекта: grep -ri 'createrolestable' database/migrations

Второе решение:

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

беги composer install

Третье решение :

Это, вероятно, будет недопустимым, но один и тот же файл не должен иметь одинаковые файлы объявления класса 2 по ошибке.

Четвертое решение :

Возможно, вы установили пакет, который имеет миграцию с тем же именем класса. Чтобы найти бег grep -ril 'createrolestable' vendor

Если он показывает какой-либо файл, то это приводит к тому, что 2 класса имеют одинаковые имена.

Вы можете создать новый php artisan make:migration create_roles_table_custom . а затем скопируйте то, что у вас есть в текущей миграции, в новый и удалите существующий (не из пакета, а тот, который вы создали).

Это создаст класс CreateRolesTableCustom, который отличается от того, что уже есть в пакете.

$ grep -ri 'createrolestable' база данных/база данных миграций/миграции/2019_01_18_020910_create_roles_table.php‌​:класс CreateRolesTable расширяет миграцию

Federico Fia Sare 19.02.2019 13:21

Тогда ваши миграции хороши. можешь сделать второй вариант и бежать composer install ?

Mihir Bhende 19.02.2019 13:32

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

Federico Fia Sare 19.02.2019 13:39

Можете ли вы сделать composer dump-autoload и проверить вывод. Показывает ли он какое-либо предупреждение желтого цвета об этом имени класса. Также проверьте наличие пробелов в конце файла миграции?

Mihir Bhende 19.02.2019 13:48

composer dump-autoload Создание оптимизированных файлов автозагрузки> Illuminate\Foundation\ComposerScripts::postAutoloadDump > @php artisan package:discover Обнаруженный пакет: barryvdh/laravel-debugbar Обнаруженный пакет: brian2694/laravel-toastr Обнаруженный пакет: fideloper/proxy Обнаруженный пакет: laracasts /generators Обнаруженный пакет: laravel/tinker Обнаруженный пакет: nesbot/carbon Манифест пакета сгенерирован успешно. Сгенерированы оптимизированные файлы автозагрузки, содержащие 3512 классов. Предупреждений нет

Federico Fia Sare 19.02.2019 14:08

Это странно, можете ли вы: grep -ril 'createrolestable' vendor установить какой-либо пакет с таким именем класса?

Mihir Bhende 19.02.2019 14:10

$ grep -ril 'createrolestable' поставщик vendor/uzzal/acl/src/database/migrations/2015_12_22_103904_c‌​reate_roles_table.ph‌​p. появляется только этот файл

Federico Fia Sare 19.02.2019 14:17

Ну вот :) У вас уже есть миграция в пакете с таким же именем. Вы можете удалить свою миграцию, создать новую php artisan make:migration create_roles_table_custom . а затем скопируйте то, что у вас есть в текущей миграции, в новую. Это создаст класс CreateRolesTableCustom, который отличается от того, что уже есть в пакете.

Mihir Bhende 19.02.2019 14:19

Спасибо!!! Не знаю почему он не появляется в поисковике но я пошел по маршруту. Могу ли я удалить эту миграцию плагина? потому что это создает конфликт, потому что я хочу создать таблицу с двойными ролями

Federico Fia Sare 19.02.2019 14:24

Я обновил свой ответ. Удаление миграции плагина — плохая идея, вы можете либо удалить этот пакет, либо сделать то, что я упомянул. У вас уже есть стол roles?

Mihir Bhende 19.02.2019 14:25

Да, я использую свою таблицу ролей, миграции плагинов их не используют.

Federico Fia Sare 19.02.2019 14:58

вы получите эту ошибку также, если имя класса внутри файла не соответствует имени файла, например, если (имя файла «2019_01_18_020910_create_roles_table.php», а класс — «CreateRoleTable», поскольку вы можете видеть роль слова в имя файла имеет "s" в конце, а имя класса - нет)

zoubair Omar 20.05.2021 17:39

Привет @MihirBhende, Да, у меня есть несколько миграций с одним и тем же именем. Должен ли я просто переименовать файл миграции и имя класса? Это приемлемо?

Akshay kn 18.09.2021 13:20

Да что это приемлемо. Но если вас беспокоят обновления имен, вызывающие проблемы с ani, я бы просто скопировал тела методов миграции вверх и вниз и создал новую команду миграции с желаемым именем. А затем вставить его туда. Затем удалите старый

Mihir Bhende 19.09.2021 21:31

У меня была эта проблема. Я использовал composer dump-autoload, и это решило проблему.

Нет, это не так. Классы миграции не сохраняются Composer как часть его карты классов.

miken32 16.12.2021 21:08

Даже если у вас нет таких файлов с тем же именем класса, и вы все еще сталкиваетесь с той же проблемой, попробуйте

composer dump-autoload

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

Таким образом, файл миграции 2019_01_18_020910_create_roles_table.php должен содержать класс CreateRolesTable. Если он содержит класс CreateRoleTable с отсутствующим s, выдается ошибка «Невозможно объявить X...». Я нашел это в Laravel 8 и может относиться к более ранним версиям.

Похоже, это происходит из-за того, что Laravel загружает файл миграции несколько раз, когда имя файла написано с ошибкой, а вторая загрузка происходит, когда возникает исключение.

Дата и время также должны быть правильно отформатированы: yyyy_mm_dd_hhmmss_

MarijnK 25.05.2021 11:20

СПАСИБО! Интересно, как это не является общеизвестным, или почему сообщение об ошибке не совсем ясно об этом

Motassem MK 29.05.2021 03:26

Поскольку файлы миграции не имеют пространства имен, они не используют автоматическую загрузку PSR-4. Итак, Laravel просто includes файлы и делает предположение, какой класс был в нем, основываясь на имени файла. Когда класс внутри миграции не следует шаблону, я вижу, что это пограничный случай, который может пойти не так. С этим можно было бы справиться лучше, но так было всегда, без спешки с исправлением. Я думаю, что ошибка в том, что Laravel не жалуется сразу, что не находит ожидаемый класс при включении файла миграции.

Jason 30.05.2021 23:30

Ты спас мой день ♥ @Jason

Mosi 10.11.2021 20:06

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

Hassan Al-Jeshi 10.12.2021 17:22

В моем случае у меня был собственный пакет с миграцией, и он не был правильно назван. Я назвал его без даты следующим образом: create_orders_table. Я изменил его на 2021_08_03_000000_create_orders_table, и это помогло.

Я столкнулся с этой (вводящей в заблуждение) ошибкой, и оказалось, что я случайно пропустил слово Create в имени класса миграции.

Ошибка: Cannot declare class FooTable, because the name is already in use

Неправильно: class FooTable extends Migration

Правильно: class CreateFooTable extends Migration

У меня была такая же проблема при переносе пользовательского пакета, где я добавил имя класса, чтобы оно выглядело как CmsCreateFailedLoginAttemptsTable, но должно было быть CreateCmsFailedLoginAttemptsTable

Derek Buntin 24.09.2021 02:46

Будьте осторожны с именем файла миграции.

Для меня имя файла миграции было:

2021-10-13_000000_create_examples_table

Но правильно было:

2021_10_13_000000_create_examples_table

ржу не могу

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

Mojtaba Michael 13.10.2021 12:40

Для меня это была проблема с Laravel Sanctum (сейчас он встроен в Laravel 8). Я сгенерировал миграции через пакет и каким-то образом получил что-то в vendor\laravel\sanctum\database\migrations.

Я запустил php artisan vendor:publish --provider = "Laravel\Sanctum\SanctumServiceProvider", чтобы сохранить стандартные миграции.

Подробнее см. в здесь.

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

php artisan optimize:clear

composer dump-autoload

Если это не решит проблему, значит, вы переименовали файл миграции, который был опубликован из Laravel Cashier. Чтобы решить эту проблему, сделайте следующее:

Rename the migration file. Something like 2019_01_18_020910_create_roles_table can be renamed to 2019_01_18_020910_create_role_table

Rename the class. Something like CreateRolesTable can be renamed to CreateRoleTable

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

Затем я возвращаю время обратно к исходному времени миграции, и проблема решена.

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