Laravel迁移:类“未找到”

72

我正在将一个 Laravel 基础项目部署到 Microsoft Azure,但每当我尝试执行 php artisan migrate 时,就会出现以下错误:

[2015-06-13 14:34:05] production.ERROR: exception 'Symfony\Component\Debug\Exception\FatalErrorException' with message 'Class '' not found' in D:\home\site\vendor\laravel\framework\src\Illuminate\Database\Migrations\Migrator.php:328

堆栈跟踪:

 #0 {main}  

有什么问题吗?非常感谢。

-- 编辑 --

迁移类

<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function(Blueprint $table)
        {
            $table->bigIncrements('id');
            $table->string('name', 50);
            $table->string('surname', 50);
            $table->bigInteger('telephone');
            $table->string('email', 50)->unique();
            $table->string('username', 50)->unique();
            $table->string('password', 50);
            $table->boolean('active')->default(FALSE);
            $table->string('email_confirmation_code', 6);
            $table->enum('notify', ['y', 'n'])->default('y');
            $table->rememberToken();
            $table->timestamps();
            
            $table->index('username');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('users');
    }
}
14个回答

117

对于使用PSR-4自动加载器的用户(composer.json):

将迁移文件夹保留在classmap数组中,不要在autoload头下的psr-4对象中包含它。因为迁移的主类迁移器不支持命名空间。例如:

"autoload": {
    "classmap": [
        "app/database/migrations"
    ],
    "psr-4": {
        "Acme\\controllers\\": "app/controllers"
    }
}

然后运行:

php artisan clear-compiled 
php artisan optimize:clear
composer dump-autoload
php artisan optimize
  • 第一个清除所有已编译的自动加载文件。
  • 第二个清除 Laravel 缓存(可选)
  • 第三个为命名空间的类构建自动加载器。
  • 第四个优化你的 Laravel 应用程序的各个部分,并为非命名空间的类构建自动加载器。

从此时开始,您将不再需要再次执行此操作,任何新迁移将正常工作。


这个工作得非常好。但是你能解释一下为什么需要这么做吗? - Felix Eve
2
@FelixEve,因为迁移没有命名空间,所以尝试通过命名空间机制(psr-4等)自动加载它们是毫无意义的。composer.json中的classmap类别就是为这些类设计的。下面的命令将根据新设置重新生成所有自动加载映射。 - Umair Ahmed
在我运行了第一个命令之后,每当我尝试运行我的项目时,它都会出现这个错误Erroneous data format for unserializing 'Symfony\Component\Routing\CompiledRoute'。我该如何解决? - Abdullah
我修好了!! 谢谢!!以备后用!如果运行第一个命令时,出现错误Erroneous data format for unserializing 'Symfony\Component\Routing\CompiledRoute'可以通过以下步骤解决:
  1. !!! 删除文件 /bootstrap/cache/routes.php
  2. composer require symfony/routing:v4.2.0
  3. php artisan route:cache
由于项目可能使用另一个版本的symfony路由,因此步骤可能无法成功完成,但无论如何都会起作用。
- Abdullah

80

只需确保您的迁移文件名与类名相同。

例如:

如果文件名为:

xxx_151955_create_post_translations_table.php

那么类名应该是:

CreatePostTranslationsTable


如果您使用的是 Laravel 9,则不需要这样做,因为迁移类是这样表示的:

return new class extends Migration


2
请记住,xxx是一个带有下划线(_)的日期。我错误地使用了连字符(-),但无法弄清楚问题出在哪里... - boryn

39

1
什么都不起作用。一直给我“未找到”错误。我已经注释了默认的迁移文件(用户和密码重置),以便它不会给我一个“SQLSTATE[42000]:语法错误指定的键太长;最大键长度为767字节(SQL错误)”(两个[Illuminate\Database\QueryException][PDOExeption])。这些文件是默认的!!!为什么我不能正确地使用这些命令....还有migrate:reset和:rollback给我“没有要回滚的内容。”你能帮忙吗? - Derk Jan Speelman

12

我曾经遇到过同样的问题。显然这是一个常见的问题,因为在Laravel的文档中甚至都建议这样做:http://laravel.com/docs/master/migrations#running-migrations

基本上你需要做的就是刷新一些composer文件。只需运行:

composer dump-autoload

这将刷新composer的自动加载文件,然后您可以运行正常的迁移,应该可以正常工作!非常好。


9

我也遇到了同样的问题。

对于我来说,解决方案是删除迁移文件,并从数据库中的“迁移”表中删除记录。

之后,我运行了

composer dump-autoload

最终成功重置/回滚了迁移。


9

我知道回答这个问题可能有点晚了,但或许对某些人仍有帮助。

如果你改变了迁移文件的名称,请确保它的内部类名也做出相应更改。

例如,如果我将迁移名称从2018_06_10_079999_create_admins_table.php更改为2018_06_10_079999_create_managers_table.php,那么它的内部类名也必须从CreateAdminsTable更改为CreateManagerTable


6

我删除了一个迁移文件,然后在运行 php artisan migrate:rollback时遇到了相同的问题。

然后我尝试了 composer dump-autoload,结果仍然出现了相同的问题。

我恢复了被删除的文件,然后尝试运行 composer dump-autoloadphp artisan migrate:rollback,这次成功了。


4

对我来说,问题在于我把我的迁移命名为2017_12_15_012645_create_modules_problems.php,而类名是CreateModulesProblemsTable。当我在文件名中添加了"_table"后缀时,一切都正常了。


3
我将面临这个问题,当我把迁移文件重命名为:

0_create_activities_table.php

当我将其重命名为以下内容时,问题得到解决:

2019_10_01_0_create_activities_table.php


3
确保你的迁移文件名与迁移类名称匹配。
例如: 如果迁移的名称是:2020_10_31_161839_create_notifications_table, 那么类名应该是:CreateNotificationsTable。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接