Laravel Artisan 事件:生成命令引发致命错误

Posted

技术标签:

【中文标题】Laravel Artisan 事件:生成命令引发致命错误【英文标题】:Laravel Artisan event:generate command throwing a Fatal error 【发布时间】:2021-12-11 01:44:51 【问题描述】:

我正在关注 Laravel 5.7 关于事件注册和生成的官方文档:https://laravel.com/docs/5.7/events#generating-events-and-listeners

我有一个EventServiceProvider,其中定义了以下事件:

<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider


    /**
     * The event handler mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        'App\Events\FormBeforeCreate' => [
            'App\Listeners\WebhookBeforeCreate',
        ],
        'App\Events\FormAfterCreate' => [
            'App\Listeners\NotifyAfterCreate',
            'App\Listeners\WebhookAfterCreate',
        ],
        'App\Events\FormBeforeUpdate' => [
            'App\Listeners\WebhookBeforeUpdate',
        ],
        'App\Events\FormAfterUpdate' => [
            'App\Listeners\NotifyAfterUpdate',
            'App\Listeners\WebhookAfterUpdate',
        ],
        'App\Events\FormBeforeDelete' => [
            'App\Listeners\WebhookBeforeDelete',
        ],
        'App\Events\FormAfterDelete' => [
            'App\Listeners\NotifyAfterDelete',
            'App\Listeners\WebhookAfterDelete',
        ],
        'App\Events\FormBeforeSave' => [
            'App\Listeners\WebhookBeforeSave',
        ],
        'App\Events\FormAfterSave' => [
            'App\Listeners\NotifyAfterSave',
            'App\Listeners\WebhookAfterSave',
        ],
    ];

    /**
     * The subscriber classes to register.
     *
     * @var array
     */
    protected $subscribe = [
        'App\Listeners\UserEventSubscriber',
    ];

    /**
     * Register any other events for your application.
     *
     * @return void
     */
    public function boot()
    
        parent::boot();
    

错误:

当我运行命令 php artisan event:generate 时,我收到以下错误:

PHP Fatal error:  Call to a member function listens() on null in /app/vendor/laravel/framework/src/Illuminate/Foundation/Console/EventGenerateCommand.php on line 35

                                                           
  [Symfony\Component\Debug\Exception\FatalErrorException]  
  Call to a member function listens() on null

根据文档,它应该这样做:

此命令将生成任何事件或侦听器列在 您的 EventServiceProvider。已经存在的事件和监听器 将保持不变

我不明白我错过了什么,因为我通过搜索网络没有发现任何类似的错误

【问题讨论】:

laravel 5.7??您可能正在查看错误的 laravel 版本 是的,这是一个很大的旧项目,我们仍处于 5.7 中。但是 5.7 文档(在我的问题中链接)表明这个命令应该可以正常工作 移除所有的监听器/事件,再次运行命令,然后一一重新添加? 请发布整个 EventServiceProvider 行号与 github.com/laravel/framework/blob/5.7/src/Illuminate/Foundation/… 上显示的不匹配。确保文件匹配。您可能需要运行composer update,或删除供应商文件并运行composer install 【参考方案1】:

这是返回 null 的行:

$providers = $this->laravel->getProviders(EventServiceProvider::class);

因此,您的EventServiceProvider 存在一些问题...请尝试使用这个:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Event;
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider

    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        'App\Events\FormBeforeCreate' => [
            'App\Listeners\WebhookBeforeCreate',
        ],
        'App\Events\FormAfterCreate' => [
            'App\Listeners\NotifyAfterCreate',
            'App\Listeners\WebhookAfterCreate',
        ],
        'App\Events\FormBeforeUpdate' => [
            'App\Listeners\WebhookBeforeUpdate',
        ],
        'App\Events\FormAfterUpdate' => [
            'App\Listeners\NotifyAfterUpdate',
            'App\Listeners\WebhookAfterUpdate',
        ],
        'App\Events\FormBeforeDelete' => [
            'App\Listeners\WebhookBeforeDelete',
        ],
        'App\Events\FormAfterDelete' => [
            'App\Listeners\NotifyAfterDelete',
            'App\Listeners\WebhookAfterDelete',
        ],
        'App\Events\FormBeforeSave' => [
            'App\Listeners\WebhookBeforeSave',
        ],
        'App\Events\FormAfterSave' => [
            'App\Listeners\NotifyAfterSave',
            'App\Listeners\WebhookAfterSave',
        ],
    ];

    /**
     * Register any events for your application.
     *
     * @return void
     */
    public function boot()
    
        parent::boot();

        //
    

【讨论】:

我进行了编辑以包含完整的 EventServiceProvider。仍然无法使用您粘贴的代码副本..【参考方案2】:

我的错,昨天晚上我好像真的很累,我们的项目在 Docker 上运行,我在 docker 外部而不是内部运行命令。

我不知道为什么它特别显示了这个错误,但是一旦我在 docker 中运行该命令,所有文件都会正确生成。

【讨论】:

以上是关于Laravel Artisan 事件:生成命令引发致命错误的主要内容,如果未能解决你的问题,请参考以下文章

laravel artisan 常用命令

Laravel - php artisan 研究

Laravel 的Artisan 命令学习

Laravel自定义artisan命令在Sell中运行

laravel5.5artisan命令

laravel5.4之artisan使用总结一