Guzzle/Nexmo 升级到 Laravel 8 后的问题
Guzzle/Nexmo Issues After Upgrading to Laravel 8
我最近对这个网络应用程序进行了一次相当大的更新,并且在大多数情况下它顺利进行......直到该应用程序尝试从 staging/production.[=25 发送短信通知=]
从laravel 7.x 升级到8.x 非常简单明了。同时我们还安装了Laravel Horizon。一切都按计划进行,在本地一切正常。
然而,当我们部署到 staging/production 时,排队的 SMS 通知失败并出现以下异常:
ReflectionException: Class Http\Adapter\Guzzle6\Client does not exist in /home/forge/dev.example.com/releases/20210609194554/vendor/laravel/framework/src/Illuminate/Container/Container.php:836
查看堆栈跟踪,我们可以看到 Nexmo 是罪魁祸首:
#5 /home/forge/dev.example.com/releases/20210609194554/vendor/nexmo/laravel/src/NexmoServiceProvider.php(150): Illuminate\Foundation\Application->make()
但是在我们的 composer.json 文件中,我们要求 Guzzle 7 具有以下内容:
"guzzlehttp/guzzle": "^7.3",
在这一点上再次值得一提的是,我在本地发送短信没有问题,本地和暂存环境之间的主要区别是我在本地使用 Laravel Valet 而 Staging 使用 Laravel Envoyer .
到目前为止我尝试过的:
- 将
"guzzlehttp/guzzle": "^7.3"
更改为 "guzzlehttp/guzzle": "^6.5|^7.3"
- 运行
php artisan horizon:purge
和 php artisan horizon:terminate
手动和部署挂钩。
- 正在 Forge 上重新启动 laravel horizon 守护程序。
- 尝试
php artisan queue:restart
- 运行
composer dump-autoload
和 composer dump-autoload -o
- 删除 composer.lock 和 vendor/ 目录从 current/ 然后 运行
composer install
- 正在重新启动 PHP、Nginx,最终是整个服务器 :(
还有更多...
非常感谢任何帮助
更新如下:
完成composer.json:
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"php": ">=7.4.1",
"arrilot/laravel-widgets": "^3.13",
"barryvdh/laravel-snappy": "^0.4.6",
"doctrine/dbal": "^2.10",
"facade/ignition": "^2.3.6",
"guzzlehttp/guzzle": "^7.3",
"intervention/image": "^2.4",
"laravel/framework": "^8.0",
"laravel/helpers": "^1.3",
"laravel/horizon": "^5.7",
"laravel/nexmo-notification-channel": "^2.5.1",
"laravel/passport": "^10.0",
"laravel/slack-notification-channel": "^2.0",
"laravel/telescope": "^4.0",
"laravel/tinker": "^2.0",
"laravel/ui": "^3.0",
"league/csv": "^8.2",
"league/flysystem-aws-s3-v3": "~1.0",
"maatwebsite/excel": "^3.1",
"milon/barcode": "^8.0.1",
"nexmo/laravel": "^2.4.1",
"nunomaduro/collision": "^5.0",
"predis/predis": "^1.1",
"pusher/pusher-php-server": "^4.1.1",
"webpatser/laravel-uuid": "^3.0"
},
"require-dev": {
"fzaninotto/faker": "~1.4",
"mockery/mockery": "0.9.*",
"phpunit/phpunit": "^9.0",
"filp/whoops": "~2.0"
},
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\": "app/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\": "tests/"
}
},
"scripts": {
"post-root-package-install": [
"php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"php artisan key:generate"
],
"post-install-cmd": [
"Illuminate\Foundation\ComposerScripts::postInstall"
],
"post-update-cmd": [
"Illuminate\Foundation\ComposerScripts::postUpdate"
],
"post-autoload-dump": [
"Illuminate\Foundation\ComposerScripts::postAutoloadDump",
"@php artisan package:discover"
]
},
"config": {
"preferred-install": "dist",
"sort-packages": true
}
}
此外,我的 nexmo 配置文件没有 http_client 的任何内容,也许这是我在某个地方错过的升级步骤。因此,对于 nexmo http_client,我的 .env 文件中没有任何内容。我也会开始研究这个。
nexmo.php
<?php
return [
/*
|--------------------------------------------------------------------------
| API Credentials
|--------------------------------------------------------------------------
|
| If you're using API credentials, change these settings. Get your
| credentials from https://dashboard.nexmo.com | 'Settings'.
|
*/
'api_key' => function_exists('env') ? env('NEXMO_KEY', '') : '',
'api_secret' => function_exists('env') ? env('NEXMO_SECRET', '') : '',
/*
|--------------------------------------------------------------------------
| Signature Secret
|--------------------------------------------------------------------------
|
| If you're using a signature secret, use this section. This can be used
| without an `api_secret` for some APIs, as well as with an `api_secret`
| for all APIs.
|
*/
'signature_secret' => function_exists('env') ? env('NEXMO_SIGNATURE_SECRET', '') : '',
/*
|--------------------------------------------------------------------------
| Private Key
|--------------------------------------------------------------------------
|
| Private keys are used to generate JWTs for authentication. Generation is
| handled by the library. JWTs are required for newer APIs, such as voice
| and media
|
*/
'private_key' => function_exists('env') ? env('NEXMO_PRIVATE_KEY', '') : '',
'application_id' => function_exists('env') ? env('NEXMO_APPLICATION_ID', '') : '',
/*
|----------------------------------------------------------------------------
| Phone Numbers
|----------------------------------------------------------------------------
|
| Phone numbers to be used by the application.
*/
'number' => env('NEXMO_NUMBER'),
'batch' => env('NEXMO_BATCH'),
];
我看到 NexmoServiceProvider
正在尝试使用配置中定义的 http_client
,所以您可以分享 .env
对 NEXMO_HTTP_CLIENT
的作用吗?我很确定你那里有问题,甚至没有定义。
这是在与该配置相关的 config/nexmo.php
中定义的内容:
'http_client' => function_exists('env') ? env('NEXMO_HTTP_CLIENT', '') : '',
我最近对这个网络应用程序进行了一次相当大的更新,并且在大多数情况下它顺利进行......直到该应用程序尝试从 staging/production.[=25 发送短信通知=]
从laravel 7.x 升级到8.x 非常简单明了。同时我们还安装了Laravel Horizon。一切都按计划进行,在本地一切正常。
然而,当我们部署到 staging/production 时,排队的 SMS 通知失败并出现以下异常:
ReflectionException: Class Http\Adapter\Guzzle6\Client does not exist in /home/forge/dev.example.com/releases/20210609194554/vendor/laravel/framework/src/Illuminate/Container/Container.php:836
查看堆栈跟踪,我们可以看到 Nexmo 是罪魁祸首:
#5 /home/forge/dev.example.com/releases/20210609194554/vendor/nexmo/laravel/src/NexmoServiceProvider.php(150): Illuminate\Foundation\Application->make()
但是在我们的 composer.json 文件中,我们要求 Guzzle 7 具有以下内容:
"guzzlehttp/guzzle": "^7.3",
在这一点上再次值得一提的是,我在本地发送短信没有问题,本地和暂存环境之间的主要区别是我在本地使用 Laravel Valet 而 Staging 使用 Laravel Envoyer .
到目前为止我尝试过的:
- 将
"guzzlehttp/guzzle": "^7.3"
更改为"guzzlehttp/guzzle": "^6.5|^7.3"
- 运行
php artisan horizon:purge
和php artisan horizon:terminate
手动和部署挂钩。 - 正在 Forge 上重新启动 laravel horizon 守护程序。
- 尝试
php artisan queue:restart
- 运行
composer dump-autoload
和composer dump-autoload -o
- 删除 composer.lock 和 vendor/ 目录从 current/ 然后 运行
composer install
- 正在重新启动 PHP、Nginx,最终是整个服务器 :(
还有更多...
非常感谢任何帮助
更新如下:
完成composer.json:
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"php": ">=7.4.1",
"arrilot/laravel-widgets": "^3.13",
"barryvdh/laravel-snappy": "^0.4.6",
"doctrine/dbal": "^2.10",
"facade/ignition": "^2.3.6",
"guzzlehttp/guzzle": "^7.3",
"intervention/image": "^2.4",
"laravel/framework": "^8.0",
"laravel/helpers": "^1.3",
"laravel/horizon": "^5.7",
"laravel/nexmo-notification-channel": "^2.5.1",
"laravel/passport": "^10.0",
"laravel/slack-notification-channel": "^2.0",
"laravel/telescope": "^4.0",
"laravel/tinker": "^2.0",
"laravel/ui": "^3.0",
"league/csv": "^8.2",
"league/flysystem-aws-s3-v3": "~1.0",
"maatwebsite/excel": "^3.1",
"milon/barcode": "^8.0.1",
"nexmo/laravel": "^2.4.1",
"nunomaduro/collision": "^5.0",
"predis/predis": "^1.1",
"pusher/pusher-php-server": "^4.1.1",
"webpatser/laravel-uuid": "^3.0"
},
"require-dev": {
"fzaninotto/faker": "~1.4",
"mockery/mockery": "0.9.*",
"phpunit/phpunit": "^9.0",
"filp/whoops": "~2.0"
},
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\": "app/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\": "tests/"
}
},
"scripts": {
"post-root-package-install": [
"php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"php artisan key:generate"
],
"post-install-cmd": [
"Illuminate\Foundation\ComposerScripts::postInstall"
],
"post-update-cmd": [
"Illuminate\Foundation\ComposerScripts::postUpdate"
],
"post-autoload-dump": [
"Illuminate\Foundation\ComposerScripts::postAutoloadDump",
"@php artisan package:discover"
]
},
"config": {
"preferred-install": "dist",
"sort-packages": true
}
}
此外,我的 nexmo 配置文件没有 http_client 的任何内容,也许这是我在某个地方错过的升级步骤。因此,对于 nexmo http_client,我的 .env 文件中没有任何内容。我也会开始研究这个。
nexmo.php
<?php
return [
/*
|--------------------------------------------------------------------------
| API Credentials
|--------------------------------------------------------------------------
|
| If you're using API credentials, change these settings. Get your
| credentials from https://dashboard.nexmo.com | 'Settings'.
|
*/
'api_key' => function_exists('env') ? env('NEXMO_KEY', '') : '',
'api_secret' => function_exists('env') ? env('NEXMO_SECRET', '') : '',
/*
|--------------------------------------------------------------------------
| Signature Secret
|--------------------------------------------------------------------------
|
| If you're using a signature secret, use this section. This can be used
| without an `api_secret` for some APIs, as well as with an `api_secret`
| for all APIs.
|
*/
'signature_secret' => function_exists('env') ? env('NEXMO_SIGNATURE_SECRET', '') : '',
/*
|--------------------------------------------------------------------------
| Private Key
|--------------------------------------------------------------------------
|
| Private keys are used to generate JWTs for authentication. Generation is
| handled by the library. JWTs are required for newer APIs, such as voice
| and media
|
*/
'private_key' => function_exists('env') ? env('NEXMO_PRIVATE_KEY', '') : '',
'application_id' => function_exists('env') ? env('NEXMO_APPLICATION_ID', '') : '',
/*
|----------------------------------------------------------------------------
| Phone Numbers
|----------------------------------------------------------------------------
|
| Phone numbers to be used by the application.
*/
'number' => env('NEXMO_NUMBER'),
'batch' => env('NEXMO_BATCH'),
];
我看到 NexmoServiceProvider
正在尝试使用配置中定义的 http_client
,所以您可以分享 .env
对 NEXMO_HTTP_CLIENT
的作用吗?我很确定你那里有问题,甚至没有定义。
这是在与该配置相关的 config/nexmo.php
中定义的内容:
'http_client' => function_exists('env') ? env('NEXMO_HTTP_CLIENT', '') : '',