重命名迁移后未找到类错误,尽管 dumpautoload 和清除缓存

Posted

技术标签:

【中文标题】重命名迁移后未找到类错误,尽管 dumpautoload 和清除缓存【英文标题】:Class not found error after renaming migration, despite dumpautoload and clearing cache 【发布时间】:2015-12-09 06:43:18 【问题描述】:

我有一个简单的 laravel 项目,其迁移运行良好。我想让它们中的一个先运行(这样我可以在以后的迁移中在外键约束中使用该表),所以我通过添加“1_”重命名了该迁移脚本,因此它是列表中的第一个。

但是当我运行迁移时自从重命名文件后,我从第 324 行的 Migrator.php 中收到类“152152CreatePeopleTable”的致命“找不到类”错误 - 请参阅下面的完整堆栈跟踪。 (当我重命名迁移文件时,当我运行迁移时会再次找到该类)。

我更新了 vendor/composer/autoload_classmap.php 中的名称以匹配更新的文件名 (1_2015_09_06_152152_create_people_table.php),并在 phpstorm 中搜索,除了 laravel.log 之外的任何其他地方都找不到“152152_create_people”,所以应该有没有其他地方可以有旧的文件名,对吧?

所以我清除了缓存并尝试了来自类似问题的其他建议(感谢 google/***):

php artisan 缓存:清除 作曲家清除缓存 作曲家转储自动加载 作曲家更新,以防万一 我确保我也有一个新的迁移表;我删除了所有数据库表(包括迁移),然后运行“php artisan migrate:install”(创建一个新的迁移表)和“php artisan migrate”以确保一切运行完全新鲜,仍然是同样的错误 hail mary:尝试将控制器、模型和迁移添加到 composer.json 中的自动加载类映射中,根据这些帖子(没有帮助,所以我把它拿回来了):"Class not found" error even after dump-autoload? 和 Laravel 4 migrate rollback problems 注意:我最初在安装过程中使用旧的 sqlite 文件,然后更改为 postgres 数据库。 Juuust 以防万一被引用,我在 database.php 中注释掉了该部分,并从项目中删除了旧的 sqlite 文件

我还应该检查/尝试什么?

[2015-09-12 22:42:19] local.ERROR: exception 'Symfony\Component\Debug\Exception\FatalErrorException' with message 'Class '152152CreatePeopleTable' not found' in /home/vagrant/Code/Family-laravel/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:324
Stack trace:
#0 /home/vagrant/Code/Family-laravel/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(133): Symfony\Component\Debug\Exception\FatalErrorException->__construct()
#1 /home/vagrant/Code/Family-laravel/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(118): Illuminate\Foundation\Bootstrap\HandleExceptions->fatalExceptionFromError()
#2 /home/vagrant/Code/Family-laravel/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(0): Illuminate\Foundation\Bootstrap\HandleExceptions->handleShutdown()
#3 /home/vagrant/Code/Family-laravel/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(129): Illuminate\Database\Migrations\Migrator->resolve()
#4 /home/vagrant/Code/Family-laravel/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(112): Illuminate\Database\Migrations\Migrator->runUp()
#5 /home/vagrant/Code/Family-laravel/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(85): Illuminate\Database\Migrations\Migrator->runMigrationList()
#6 /home/vagrant/Code/Family-laravel/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(74): Illuminate\Database\Migrations\Migrator->run()
#7 /home/vagrant/Code/Family-laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php(502): Illuminate\Database\Console\Migrations\MigrateCommand->fire()
#8 /home/vagrant/Code/Family-laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php(502): call_user_func_array:/home/vagrant/Code/Family-laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php:502()
#9 /home/vagrant/Code/Family-laravel/vendor/laravel/framework/src/Illuminate/Console/Command.php(150): Illuminate\Container\Container->call()
#10 /home/vagrant/Code/Family-laravel/vendor/symfony/console/Command/Command.php(259): Illuminate\Console\Command->execute()
#11 /home/vagrant/Code/Family-laravel/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Symfony\Component\Console\Command\Command->run()
#12 /home/vagrant/Code/Family-laravel/vendor/symfony/console/Application.php(878): Illuminate\Console\Command->run()
#13 /home/vagrant/Code/Family-laravel/vendor/symfony/console/Application.php(195): Symfony\Component\Console\Application->doRunCommand()
#14 /home/vagrant/Code/Family-laravel/vendor/symfony/console/Application.php(126): Symfony\Component\Console\Application->doRun()
#15 /home/vagrant/Code/Family-laravel/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(100): Symfony\Component\Console\Application->run()
#16 /home/vagrant/Code/Family-laravel/artisan(36): Illuminate\Foundation\Console\Kernel->handle()
#17 /home/vagrant/Code/Family-laravel/artisan(0): main()
#18 main  

【问题讨论】:

你确定你的类名152152CreatePeopleTable in 1_2015_09_06_152152_create_people_table.php吗?此外,请确保数据库中的 migrations 表不包含任何具有旧名称的批次。 好主意!我在迁移中的类名只是普通的单词(如“CreateUsersTable”或“CreatePeopleTable”,但所有迁移文件名的日期前也有一个数字(如“2015_09_06_152152_create_people_table.php”)- laravel 附带的那些,和我通过工匠创建的那些。(在我编辑之前以这种方式工作)还有新的迁移表:当解决迁移问题时,我通过删除我的所有数据库表(包括迁移)到一个新的地方,然后 php artisan migrate:install (创建一个新的迁移表)和 php artisan migrate 【参考方案1】:

php artisan dump-autoload 在 Laravel 5 中不存在,你可以使用 composer dump-autoload 代替

【讨论】:

【参考方案2】:

实际上,Laravel 会在所有迁移类前面加上日期,这样他就可以及时了解当前模式状态,当你在类前面加上“1_”时,Laravel 将无法解析它,因此会出现错误。

作为一种解决方案,将文件重命名为项目中最早的日期,例如2014_01_06_152152_create_people_table.php,然后运行php artisan dump-autoload(也许您需要删除所有表)。 但是,请记住,这不是合适的解决方案,因为:

迁移就像数据库的版本控制,允许团队轻松修改和共享应用程序的数据库架构。

确实,继续跟踪您的架构状态的最佳选择是创建一个新的迁移artisan make:migration add_person_forein_key_to_your_table(也许稍后,您不再需要此外键,因此您只需删除该文件或创建另一个迁移来删除它)。如果您刚刚开始您的项目,只需将您的迁移重命名就可以了,但如果您在一个有很多同事的大型项目中工作,我建议您创建一个新的迁移。

【讨论】:

就是这样!!!!我知道日期是用来使它们保持连续顺序的,但没有意识到它依赖于以日期开头的名称特别是。我按照您的建议对其进行了更新,现在可以使用了-谢谢!!!!!!! (关于你所说的关于进行单独迁移的内容,我会针对出现的特殊/外围更改进行此操作,但由于这是一个我刚刚开始的项目,我认为外键声明在 crate 脚本中是有意义的 - 但是让我知道这是否违反最佳实践)。感谢您的帮助! 在您的情况下,我将像您一样重命名文件并添加外键声明。我只是想澄清一下,迁移不仅用于创建表,还用于添加索引、删除列、声明触发过程......也在生产数据库中,不建议重命名迁移,因为当您删除所有数据时refresh 数据库。总而言之,在开发项目时做任何你想做的事情,直到你部署它或者你正在与几十个同事一起工作。 不客气,很高兴我能帮上忙。如果我的回答解决了你的问题,请accept it 糟糕,我投了赞成票,但没有看到接受它的复选图标 - 现在完成!

以上是关于重命名迁移后未找到类错误,尽管 dumpautoload 和清除缓存的主要内容,如果未能解决你的问题,请参考以下文章

Django 2.0.7 - 进行重命名字段迁移时出现语法错误

领域版本迁移重命名属性不存在

在不破坏现有迁移的情况下重命名 Django 模型

重命名列名时的 SQLITE 语法错误代码 1

Django - 迁移后未创建表

尽管编辑了我的包含语句以修复,但得到“错误 C2653:'TextureManager':不是类或命名空间名称”