未捕获的 ReflectionException:Class 散列在 envoyer 部署中不存在

Uncaught ReflectionException: Class hash does not exist in envoyer deploy

我像往常一样使用 envoyer 进行部署。一个警告是,在我的本地主机开发过程中(当我切换 git 分支时)。我遇到了这个错误:

[ReflectionException] Class App\Http\Controllers\Admin\BatchUpdateStoresController does not exist

我通过清除路由缓存解决了这个问题(查看详情)。

现在的问题是,当我在 envoyer 上部署时.. 我在 nginx 日志中收到此错误:

PHP message: PHP Fatal error:  Uncaught ReflectionException: Class hash does not exist in /home/forge/default/envoyer/releases/20180306221058/bootstrap/cache/compiled.php:1479
Stack trace:
#0 /home/forge/default/envoyer/releases/20180306221058/bootstrap/cache/compiled.php(1479): ReflectionClass->__construct('hash')
#1 /home/forge/default/envoyer/releases/20180306221058/bootstrap/cache/compiled.php(1433): Illuminate\Container\Container->build('hash', Array)
#2 /home/forge/default/envoyer/releases/20180306221058/bootstrap/cache/compiled.php(2011): Illuminate\Container\Container->make('hash', Array)
#3 /home/forge/default/envoyer/releases/20180306221058/bootstrap/cache/compiled.php(1686): Illuminate\Foundation\Application->make('hash')
#4 /home/forge/default/envoyer/releases/20180306221058/bootstrap/cache/compiled.php(524): Illuminate\Container\Container->offsetGet('hash')
#5 /home/forge/default/envoyer/releases/20180306221058/bootstrap/

我尝试一起删除 /home/forge/default/envoyer/releases/20180306221058/bootstrap 文件夹..但这只会让情况变得更糟(即我什至不再收到 nginx 错误日志)。

我该怎么办?

我在升级到 5.6 后遇到了丢失 Hash class 异常。问题是升级指南中被忽略的步骤:

All hashing configuration is now housed in its own config/hashing.php configuration file. You should place a copy of the default configuration file in your own application. Most likely, you should maintain the bcrypt driver as your default driver. However, argon is also supported.

事实证明,我向 composer 添加了一个 library,并将其服务提供商和别名添加到 config/app。php 如下所示:

'providers'       => [
 ..
    Clockwork\Support\Laravel\ClockworkServiceProvider::class,

'aliases'         => [ 
..
    'Clockwork'        => Clockwork\Support\Laravel\Facade::class,

但后来从 composer 中删除了该库(b/c 我不再使用它)并忘记更新服务提供商。

更新服务提供商解决了问题。

奖金

我的一位工程师在处理一个包含 100 次提交的 Pull Request 时又遇到了同样的问题(这是一个主题 b运行ch.. 请不要评判)。

他确认所有的库都被使用了。

所以我所做的是,我只是 运行 对两个特定文件进行 git 差异,仅在那个大的 运行ge 中:config/app.phpcomposer.json 像这样:

Composer.json

$ git diff 96d397a bce2052 composer.json
diff --git a/composer.json b/composer.json
index 4c16f388..d780ec01 100644
--- a/composer.json
+++ b/composer.json
@@ -4,6 +4,12 @@
     "keywords": ["framework", "laravel"],
     "license": "MIT",
     "type": "project",
+    "repositories": [
+        {
+            "type": "vcs",
+            "url":  "https://github.com/abbood/translation"
+        }
+    ],
     "require": {
         "php": ">=5.5.9",
         "laravel/framework": "5.3.*",
@@ -26,7 +32,9 @@
         "aloha/twilio": "^2.1",
         "laravel/socialite": "^2.0",
         "barryvdh/laravel-dompdf": "^0.8.0",
-        "mockery/mockery": "1.0"
+        "mockery/mockery": "1.0",
+        "maxmind-db/reader": "~1.0",
+        "waavi/translation": "dev-extractGenCode"
     },
     "require-dev": {
         "symfony/dom-crawler": "~3.1",
@@ -35,6 +43,7 @@
         "phpunit/phpunit": "~5.0",
         "phpspec/phpspec": "~2.1",
         "johnkary/phpunit-speedtrap": "^1.0",
+        "orangehill/iseed": "2.2",
         "barryvdh/laravel-ide-helper": "^2.4"
     },
     "autoload": {

config/app.php

git diff 96d397a bce2052 config/app.php
diff --git a/config/app.php b/config/app.php
index 5025f79b..28e34794 100644
--- a/config/app.php
+++ b/config/app.php
@@ -10,8 +10,8 @@ return [
     | the framework needs to place the application's version in a notification
     | or any other location as required by the application or its packages.
     */
+    'version' => '1.3.57',

-    'version' => '1.3.46',

     'env' => env('APP_ENV', 'production'),

@@ -115,6 +115,17 @@ return [
     /*those options are overriden in bootstrap/app for info.log and error.log*/
     'log'             => 'daily',

+    /*
+    |--------------------------------------------------------------------------
+    | MaxMind mmdb Path
+    |--------------------------------------------------------------------------
+    |
+    | Here you specify the path to MaxMind GeoLite2-City.mmdb
+    |
+    |
+    */
+    'maxmindDB'             => env('APP_MAX_MIND_MMDB', "./maxmind/GeoLite2-City.mmdb"),
+
     /*
     |--------------------------------------------------------------------------
     | Autoloaded Service Providers
@@ -149,7 +160,6 @@ return [
         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,

@@ -180,7 +190,10 @@ return [
         Davibennun\LaravelPushNotification\LaravelPushNotificationServiceProvider::class,
         Aloha\Twilio\Support\Laravel\ServiceProvider::class,
         Laravel\Socialite\SocialiteServiceProvider::class,
+        Orangehill\Iseed\IseedServiceProvider::class,
         Barryvdh\DomPDF\ServiceProvider::class,
+        Waavi\Translation\TranslationServiceProvider::class,
+
     ],
     /*
     |--------------------------------------------------------------------------
@@ -239,6 +252,8 @@ return [
         'Raven'            => Jenssegers\Raven\Facades\Raven::class,
         'Socialite'        => Laravel\Socialite\Facades\Socialite::class,
         'PDF'              => Barryvdh\DomPDF\Facade::class,
+        'UriLocalizer'     => \Waavi\Translation\Facades\UriLocalizer::class,
+        'TranslationCache' => \Waavi\Translation\Facades\TranslationCache::class,
     ],

 ];

所以问题很清楚:基本上我们将 "orangehill/iseed": "2.2", 作为 require-dev 要求包括在内,但在我们将其注册为服务提供商时不检查 env 是否为 dev.. 所以它炸了。

所以这在 app/Providers/AppServiceProvider.php:

内修复了它
namespace App\Providers;


use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{


    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        $env = config('app.env');



        if ($env === 'local' || $env === 'testing') {
            .. dev only libraries
            $this->app->register(\Orangehill\Iseed\IseedServiceProvider::class);
        }
    }


}

奖金 2

有时您必须删除整个 bootstrap 目录

rm -rf bootstrap

然后 运行

composer dump-autoload

但 laravel 之后将无法工作,因此您必须 git 恢复删除所有 bootstrap 的更改(应该在您的 git 存储库中无论如何)..然后你就变成了金子