Laravel 9集成DynamoDB-local报错:无法解析AwsClient依赖参数
向DynamoDB-Local插入POST数据时的依赖注入错误排查
版本信息
- Laravel: 9.48.0
问题详情
将DynamoDbClient $client注入控制器构造函数时触发错误:
Unresolvable dependency resolving [Parameter #0 [ array $args ]] in class Aws\AwsClient
推测问题源于构造函数的依赖解析环节,已尝试清除缓存但未解决。
代码示例
<?php use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Aws\DynamoDb\DynamoDbClient; use Aws\DynamoDb\Marshaler; use Aws\Sdk; class ReplyKeywordsController extends Controller { /** * @var Marshaler */ private $marshaler; /** * @var DynamoDbClient */ private $client; /** * DynamoModel constructor * @param DynamoDbClient $client * @param Marshaler $marshaler */ public function __construct(DynamoDbClient $client, Marshaler $marshaler) { $this->client = $client; $this->marshaler = $marshaler; } public function store(Request $request) { $replyKeyword = $request->all(); $replyKeyword = $this->marshaler->marshalItem($request->all()); $dynamoParameters = [ "TableName" => "keywords", "Key" => $replyKeyword ]; $this->client->putItem($dynamoParameters); return redirect("reply_keyword"); } }
解决方案
1. 手动绑定DynamoDbClient到服务容器
Laravel无法自动解析DynamoDbClient,因为它需要初始化参数(区域、端点、凭证等)。在app/Providers/AppServiceProvider.php的register方法中添加绑定逻辑:
use Aws\DynamoDb\DynamoDbClient; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function register() { $this->app->bind(DynamoDbClient::class, function ($app) { return new DynamoDbClient([ 'region' => env('AWS_REGION', 'us-east-1'), 'version' => 'latest', 'endpoint' => env('DYNAMODB_LOCAL_ENDPOINT', 'http://localhost:8000'), 'credentials' => [ 'key' => env('AWS_ACCESS_KEY_ID', 'dummy'), 'secret' => env('AWS_SECRET_ACCESS_KEY', 'dummy'), ], ]); }); } }
2. 可选:绑定Marshaler(若需要)
Marshaler无需额外参数,Laravel可自动解析,若仍有问题也可手动绑定:
use Aws\DynamoDb\Marshaler; $this->app->bind(Marshaler::class, function () { return new Marshaler(); });
3. 配置环境变量
确保.env文件包含以下配置:
AWS_REGION=us-east-1 DYNAMODB_LOCAL_ENDPOINT=http://localhost:8000 AWS_ACCESS_KEY_ID=dummy AWS_SECRET_ACCESS_KEY=dummy
4. 清理缓存
执行以下命令更新容器缓存:
php artisan cache:clear php artisan config:clear php artisan route:clear
问题根源
DynamoDbClient的父类AwsClient构造函数需要必填的$args数组参数,Laravel服务容器无法自动推断这些初始化参数,必须手动提供实例化逻辑并绑定到容器,才能实现依赖注入。
内容的提问来源于stack exchange,提问作者Hayato Kuroda
相关产品推荐
相关产品推荐

