Laravel 5.1 升级到 5.2 时出现致命错误。

58

我正在按照官方的 升级指南 从5.1升级到5.2。第一个子节说:

如果您正在安装 Laravel 5.2 的 beta 版本,请将 "minimum-stability": "beta" 添加到您的 composer.json 文件中。

更新您的 composer.json 文件以指向 laravel/framework 5.2.*

symfony/dom-crawler ~3.0symfony/css-selector ~3.0 添加到您的 composer.json 文件的 require-dev 部分。

现在,在我进行以上更改并运行 composer update 后,我收到以下错误信息:

PHP Fatal error:  Class 'Illuminate\Routing\ControllerServiceProvider' not found 
in /home/vagrant/Code/myproject/vendor/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php on line 146

[Symfony\Component\Debug\Exception\FatalErrorException]
Class 'Illuminate\Routing\ControllerServiceProvider' not found

[RuntimeException]
Error Output: PHP Fatal error:  Class 'Illuminate\Routing\ControllerServiceProvider' not found in /home/vagrant/Code/myproject/vendor/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php on line 146

更新完成后会抛出错误,这些错误会在“生成autoload文件”之后发生。

可能出了什么问题?

看起来不像是自定义包问题,而是核心问题。我应该继续使用升级指南,并在所有内容都适应新框架版本之后运行composer update吗?

更新

之后运行composer dump-autoload 不会引发上述错误。尽管如此,还是有些困惑。


3
相关的话题上,未来的读者可能会想查看Laravel Shift——一个用于升级Laravel项目的自动化工具。 - Jason McCreary
6个回答

62

现在没有Illuminate\Routing\ControllerServiceProvider了。

如果我是你,我会将我的应用项目与https://github.com/laravel/laravel/commits/develop进行比较。例如,如果您查看https://github.com/laravel/laravel/blob/develop/config/app.php,您将看到Laravel 5.2的默认提供程序:

Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
Illuminate\Bus\BusServiceProvider::class,
Illuminate\Cache\CacheServiceProvider::class,
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
Illuminate\Cookie\CookieServiceProvider::class,
Illuminate\Database\DatabaseServiceProvider::class,
Illuminate\Encryption\EncryptionServiceProvider::class,
Illuminate\Filesystem\FilesystemServiceProvider::class,
Illuminate\Foundation\Providers\FoundationServiceProvider::class,
Illuminate\Hashing\HashServiceProvider::class,
Illuminate\Mail\MailServiceProvider::class,
Illuminate\Pagination\PaginationServiceProvider::class,
Illuminate\Pipeline\PipelineServiceProvider::class,
Illuminate\Queue\QueueServiceProvider::class,
Illuminate\Redis\RedisServiceProvider::class,
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
Illuminate\Session\SessionServiceProvider::class,
Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,
/*
 * Application Service Providers...
 */
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,

1
这是否意味着我可以安全地从config/app.php中删除该条目? - lesssugar
看起来是的,但你应该确保app文件夹的整个结构和文件内容与Laravel 5.2的新文件夹匹配。 - Marcin Nabiałek
好的,谢谢。实际上升级指南告诉我在服务提供者部分删除它。看来最好在调整了所有代码和结构之后再更新composer依赖关系。 - lesssugar
1
@lesssugar 是的,升级说明顺序有些奇怪。 - andrewtweber
4
如果你已经将它们移除,但系统仍在寻找它们怎么办?我认为它们可能被缓存了,因为它们存在于我的bootstrap/cache/services.json文件中。 - Bill Garrison
显示剩余2条评论

22

从config/app.php中删除两个服务提供商

Illuminate\Foundation\Providers\ArtisanServiceProvider::class,
 Illuminate\Routing\ControllerServiceProvider::class,

21

在更新现有项目的5.1版本到5.2版本时,我们发现在删除以下服务提供者类行之前和之后运行composer update是完成Laravel更新所必需的序列:

Illuminate\Routing\ControllerServiceProvider::class Illuminate\Foundation\Providers\ArtisanServiceProvider::class

运行命令之前可以让Laravel下载和更新当前框架库依赖项,然后在移除之后运行(Composer能够顺利完成)

我们还发现,.env文件中任何值都不能有空格并且必须用引号括起来才能正常工作。


10

在config/目录下更新app.php文件可以解决一个问题,但是由于引入了bootstrap/cache文件夹,您可能会继续遇到相同的错误。

在删除缓存文件之前,我运行了composer update,因此一直遇到相同的错误。请确保先删除bootstrap/cache/services.php文件。

可能有一个artisan命令可以完成此操作,但我在文档中完全错过了这一步骤。


1
这很有帮助,使用 rm bootstrap/cache/*.php 可以修复我的错误。 - JS Lee
这个答案帮助我解决了问题。仅仅删除services.php并不能解决错误。我还需要删除bootstrap/cache/compile.php。在我的本地环境中一切正常,但是在生产服务器上出现问题,删除这两个缓存文件解决了我的问题。感谢@adam! - JustLearninThisStuff

3
我在这里找到了解决方案: https://laravel.com/docs/5.2/upgrade#upgrade-5.2.0 服务提供者 在您的 app.php 配置文件中,应从服务提供者列表中移除 Illuminate\Foundation\Providers\ArtisanServiceProvider
在您的 app.php 配置文件中,应从服务提供者列表中移除 Illuminate\Routing\ControllerServiceProvider

2

在运行composer dump-autoload后,从引导缓存文件夹中删除packages.php和config.php。


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