Class 重命名迁移后未发现错误,尽管 dumpautoload 和清除缓存

Class not found error after renaming migration, despite dumpautoload and clearing cache

我有一个简单的 laravel 项目,其中的迁移 运行 很好。我想首先制作其中一个 运行(这样我可以在以后的迁移中的外键约束中使用那个 table),所以我通过在前面加上“1_”重命名了那个迁移脚本,所以它是第一个名单。

但是当我 运行 迁移 自从重命名文件后,我得到一个致命的 'class not found' 错误 for Class '152152CreatePeopleTable',来自Migrator.php 第 324 行 - 请参阅下面的完整堆栈跟踪。 (当我重命名迁移文件时,运行 迁移时再次找到 class)。

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

所以我清除了缓存并尝试了 similar-sounding 个问题的其他建议(谢谢 google/Whosebug):

我还应该是什么checking/trying?

[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}  

实际上 Laravel 为所有迁移 classes 加上日期前缀,这样他就可以在当前架构状态上保持最新状态,当您在 class 前面加上“1_”时,Laravel 将无法解析它,因此会出现错误。

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

Migrations are like version control for your database, allowing a team to easily modify and share the application's database schema.

事实上,保持跟踪架构状态的最佳选择是创建一个新的迁移 artisan make:migration add_person_forein_key_to_{your_table}(也许稍后,您不再需要这个外键,因此您只需删除该文件或创建另一个迁移到算了吧)。如果您刚刚开始您的项目,只需重命名您的迁移就可以了,但如果您在一个大型项目中与许多同事一起工作,我建议您创建一个新的迁移。

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