Laravel 手动创建 Command 或 Seed 文件时遇到的报错
in LaravelPHP with 0 comment

Laravel 手动创建 Command 或 Seed 文件时遇到的报错

in LaravelPHP with 0 comment

ChMkJleiqtSIQ823AAGp4vFVEEsAAUJOAEcAAUAAan6280.png

异常

某天半夜被领导电话叫起来修bug遇到的问题, 起因是写代码的时候在 IDE 里手动创建了个 Command 文件, 并没有用 artisan make:command 指令生成, 本地开发过程中一直没有任何问题, 结果线上报错如下:

[2019-07-1600:00:02]local.ERROR:ReflectionException:Class App\Console\Commands\xxxCommand does not exist in/www/xxx/vendor/laravel/framework/src/Illuminate/Container/Container.php:729
Stacktrace:
#0/www/xxx/vendor/laravel/framework/src/Illuminate/Container/Container.php(729):ReflectionClass->__construct('App\\Console\\Com...')
#1/www/xxx/vendor/laravel/framework/src/Illuminate/Container/Container.php(608):Illuminate\Container\Container->build('App\\Console\\Com...')
#2/www/xxx/vendor/laravel/framework/src/Illuminate/Container/Container.php(575):Illuminate\Container\Container->resolve('App\\Console\\Com...')
#3/www/xxx/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(728):Illuminate\Container\Container->make('App\\Console\\Com...')
#4/www/xxx/vendor/laravel/framework/src/Illuminate/Console/Application.php(192):Illuminate\Foundation\Application->make('App\\Console\\Com...')
#5/www/xxx/vendor/laravel/framework/src/Illuminate/Console/Application.php(206):Illuminate\Console\Application->resolve('App\\Console\\Com...')
#6/www/xxx/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(285):Illuminate\Console\Application->resolveCommands(Array)
#7/www/xxx/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(122):Illuminate\Foundation\Console\Kernel->getArtisan()
#8/www/xxx/artisan(35):Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput),Object(Symfony\Component\Console\Output\ConsoleOutput))
#9{main}

解决

命令行运行如下指令:

composer dump-autoload

原因

在运行 artisan make:commandartisan make:seeder 的时候, 会执行如下:

/**
     * Execute the console command.
     *
     * @return void
     */
    public function handle()
    {
        parent::handle();

        $this->composer->dumpAutoloads();
    }

可以看到处理完操作后会主动执行 dumpAutoloads() 重新编译自动加载文件.

总结

真是血的教训, 半夜被电话叫醒修bug, 为啥是半夜才出这个问题呢, 因为程序中有 schedule 执行的其他的 command 在凌晨执行, 所以我这次添加的新的 command 并没有影响到 Laravel 中 HTTP 容器的相关业务, 只有 Console 容器受到影响, 而凌晨的 定时任务 无疑就成为了 定时炸弹.

Responses
icon_mrgreen.gificon_neutral.gificon_twisted.gificon_arrow.gificon_eek.gificon_smile.gificon_confused.gificon_cool.gificon_evil.gificon_biggrin.gificon_idea.gificon_redface.gificon_razz.gificon_rolleyes.gificon_wink.gificon_cry.gificon_surprised.gificon_lol.gificon_mad.gificon_sad.gificon_exclaim.gificon_question.gif