2015-08-25 47 views
9

我已经开始学习Laravel了。到现在为止,一切都很完美。我正在学习这个教程,并且我坚持使用episode 7PHP工匠突然不工作

问题是我不能再开始工匠了。我试图安装修补匠,并且我可能更新了工匠,所以我最终没有工匠和修补匠。我正在使用Linux Ubuntu 12.04 LTS。我已通过命令行安装了所有内容。从那以后,我试图运行:

PHP工匠--version

发生以下问题:

[ErrorException]
软件\供应商的声明\ EventServiceProvider ::启动()应该是 兼容 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": "^[email protected]", 
"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命令行可以更新某种简单的工匠吗?

+1

Laravel 5.2甚至还没有尚未公布。 – lukasgeiter

+1

就像他说的...将您的版本更改为Laravel 5.1 – CreativityKills

回答

2

从一个PHP一点,当工匠试图启动其CLI应用严格地说,你会得到这个错误应用程序\提供商

宣言\ EventServiceProvider ::启动()应该是兼容Illuminate \ Foundation \ Support \ Providers \ EventServiceProvider :: boot

您已定义类App\Providers\EventServiceProvider。此班级有Illuminate\Foundation\Support\Providers\EventServiceProvider作为父母/祖先(在您的班级中的别名为ServiceProvider)。

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

你不能那样做。

让你boot与父类兼容,你就解决了你的问题。

(然而,这可能不会解决你所有的问题,因为意见使它听起来像你正在使用Laravel的未发布的版本,可以从什么是在一个教程不同)

+0

Alan Strom - 我可以在哪里找到Illuminate \ Foundation \ Support \ Providers \ EventServiceProvider,因此我知道它确切地是“there”问题,而不是其他文件? 我实际上没有做任何事情......我之前没有定义任何引导,我不知道现在我怎么能让我的“引导兼容父级”?我想我应该使用Laravel 5.1 – DarioBB

+0

@DarioBB在'Illuminate/Foundation/Support/Providers \ EventServiceProvider.php'的路径下的文件系统文件中寻找字符串''function boot''或类似的东西。由于PSR4,您可以知道文件系统路径,因为它将匹配命名空间。这听起来像'EventServiceProvider :: boot()'是一个接口声明的函数,并且你缺少在那里声明的参数。 – user151841

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

3

我在锻造遇到同样的问题在执行升级到5.3,你需要摆脱引导/缓存和你所提到的,所以你需要做的工匠不会因为错误的发动它是旧的方式:rm -R bootstrap/cache然后mkdir bootstrap/cache。完成后不要忘记应用引导程序/缓存的正确权限。

+0

这是正确的答案 –

6

类似@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