如何在Lambda的Cognito PostConfirmation处理器中加载Laravel?
问题描述
我们使用Bref在Lambda函数上运行Laravel REST API,其余功能均正常,但集成Cognito时遇到问题:需处理Cognito的PostConfirmation事件,目前可接收并读取事件数据,但无法在处理器中加载Laravel,也无法调用AuthService.register()等Laravel工具类。
现有代码如下:
serverless.yml
functions: postConfirm: app/Fns/PostConfirm.php event: - congitoUserPool: pool: user-pool trigger: PostConfirmation existing: true
PostConfirm.php
<?php // .. 为简洁省略部分代码 class PostConfirm implements \Bref\Event\Handler { public function handle ($event, \Bref\Event\Context $c) { $userAtt = $event['request']['userAttributes']; // 加载laravel并调用AuthService.register() return $event; } } return new PostConfirm();
曾查看bref/laravel-bridge包中的Sqs Handler,但因7年未接触PHP难以理解,请教如何在该处理器文件中干净地实例化Laravel?
解决方案
1. 修正serverless.yml配置(缩进与拼写错误)
你的serverless.yml存在格式问题,正确配置如下:
functions: postConfirm: handler: app/Fns/PostConfirm.php events: - cognitoUserPool: pool: user-pool trigger: PostConfirmation existing: true
- 补充
handler字段,修正event为复数events - 修正拼写错误
congito为cognito,统一缩进层级
2. 在处理器中初始化Laravel应用
直接引入Laravel的引导文件并完成应用初始化即可,修改后的PostConfirm.php示例:
<?php // .. 为简洁省略部分代码 class PostConfirm implements \Bref\Event\Handler { public function handle($event, \Bref\Event\Context $c) { $userAtt = $event['request']['userAttributes']; // 加载Laravel应用入口文件(根据文件路径调整相对位置) $app = require __DIR__.'/../../bootstrap/app.php'; // 完成应用引导 $app->make(\Illuminate\Contracts\Console\Kernel::class)->bootstrap(); // 从Laravel容器中获取服务类并调用方法 $authService = $app->make(App\Services\AuthService::class); $authService->register($userAtt); return $event; } } return new PostConfirm();
- 调整
require的路径,确保能正确指向Laravel的bootstrap/app.php - 通过容器
$app->make()获取服务类,即可正常调用Laravel的工具类和业务逻辑 - 若使用Laravel门面(如
Auth::xxx),应用初始化后可直接使用
3. 额外优化建议
- 可以将应用初始化逻辑放到类的构造函数中,利用Lambda的执行上下文复用已初始化的应用实例,提升性能
- 确认Lambda打包配置包含Laravel的
vendor目录及所有依赖文件,Bref默认会处理,但自定义打包规则时需注意
内容的提问来源于stack exchange,提问作者clueless
相关产品推荐
相关产品推荐

