首页 文章

PHP工匠突然不起作用

提问于
浏览
10

我已经开始学习Laravel了 . 到目前为止,一切都运作良好 . 我坚持episode 7 .

问题是我不能再开始工匠了 . 我试图安装修补匠,我可能已经更新了工匠,所以我最终没有工匠和修补匠 . 我使用的是Linux Ubuntu 12.04 LTS . 我已经通过命令行安装了所有内容 . 之后我试着跑:

php artisan --version

出现以下问题:

[ErrorException] App \ Providers \ EventServiceProvider :: boot()声明应与Illuminate \ Foundation \ Support \ Providers \ EventServiceProvider :: boot()兼容

这就是我的文件 app/Providers/EventServiceProvider.php 的样子:

<?php

namespace App\Providers;

use Illuminate\Contracts\Events\Dispatcher as DispatcherContract;
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\SomeEvent' => [
            'App\Listeners\EventListener',
        ],
    ];

    /**
     * Register any other events for your application.
     *
     * @param  \Illuminate\Contracts\Events\Dispatcher  $events
     * @return void
     */
    public function boot(DispatcherContract $events)
    {
        parent::boot($events);

        //
    }
}

我正在使用Laravel 5.2和我的composer.json它看起来像这样:

"php": ">=5.5.9",
"laravel/framework": "5.2.*",
"doctrine/dbal": "^2.6@dev",
"vluzrmos/tinker": "dev-master",
"moon/artisan": "dev-master"

我在这里看到过类似的问题,例如:

https://laracasts.com/discuss/channels/general-discussion/l5-composer-update-ends-with-an-error-suddenly

https://laracasts.com/discuss/channels/laravel/event-service-provider-in-package

但从来没有直接给出答案,实际上我不明白如何解决这个问题?我需要直接回答,因为我是Laravel的新手 . 可以通过Linux命令行以某种方式更新工匠,以便它可以再次工作吗?

4 回答

  • 9

    显然,新的 boot() 方法不必对三个提供者进行一些更改 .

    /**
          * Register any other events for your application.
          *
    -     * @param  \Illuminate\Contracts\Events\Dispatcher  $events
          * @return void
          */
    -    public function boot(DispatcherContract $events)
    +    public function boot()
         {
    -        parent::boot($events);
    +        parent::boot();
    
             //
         }
    

    查看此提交以获取完整的更改列表 .

    https://github.com/laravel/laravel/commit/2b05ce3b054593f7622c1be6c4c6aadc1c5a54ae

  • 7

    与@greut答案类似,但如果它是由升级laravel引起的(如果您通过 composer update 安装其他软件包可能会触发,而laravel的版本是 dev-master ),则需要更改参数的2个位置 .

    App\Providers\RouteServiceProvider
    App\Providers\EventServiceProvider
    

    在两个控制器中,都有一个名为 boot() 的方法 . 将参数更改为空 . 即

    public function boot(/*original something here. empty it*/)
    {
        parent::boot(/*original something here. empty it*/);
    }
    

    参考:https://laracasts.com/discuss/channels/forge/laravel-53-update-causing-error-on-forge-only/replies/189654

  • 3

    我在执行升级到5.3时遇到了同样的伪造问题,你需要摆脱bootstrap / cache,因为你提到artisan不会因为那个错误而启动所以你需要以旧的方式去做: rm -R bootstrap/cache 然后 mkdir bootstrap/cache . 完成后不要忘记应用bootstrap / cache的正确权限 .

  • 2

    严格地说,从PHP的角度来看,当工匠尝试启动其CLI应用程序时,您会收到此错误

    App \ Providers \ EventServiceProvider :: boot()声明应与Illuminate \ Foundation \ Support \ Providers \ EventServiceProvider :: boot兼容

    你已经定义了一个类 App\Providers\EventServiceProvider . 此类具有 Illuminate\Foundation\Support\Providers\EventServiceProvider 作为父/祖先(在您的类中别名为 ServiceProvider ) .

    your Illuminate\Foundation\Support\Providers\EventServiceProvider 中的引导方法有一组参数 . 您已在 App\Providers\EventServiceProvider 中定义了 boot ,并以某种方式更改了这些参数(更少的参数,不同的类型提示,不同/无默认值等) .

    你不能这样做 .

    让你 boot 与父类兼容,你将解决你的问题 .

    (但是,这可能无法解决您的所有问题,因为这些评论听起来好像您正在使用未发布的Laravel版本,可能与教程中的内容不同)

相关问题