Laminas API Tools新手:REST服务中如何正确注入Mail服务?
在Laminas API Tools中为REST服务注入Mail服务
刚接触Laminas API Tools的话,依赖注入这块确实容易懵,不过按照下面的步骤来,很快就能搞定把Mail服务注入到你的UsersResource里的需求:
1. 扩展UsersResource类,添加Mail服务依赖
因为你的UsersResource继承了DbConnectedResource,我们需要重写它的构造函数,在保留父类依赖的同时注入Mail实例(构造注入是最直观的依赖注入方式):
namespace account\V1\Rest\Users; use Laminas\ApiTools\DbConnectedResource; use account\Core\Mail\Mail; // 引入Mail类 class UsersResource extends DbConnectedResource { // 新增Mail服务属性 protected $mailService; // 重写构造函数,调用父类构造并注入Mail public function __construct( \Laminas\Db\TableGateway\TableGatewayInterface $table, \Laminas\ApiTools\ApiProblem\ApiProblemListener $listener, Mail $mailService // 新增的Mail依赖 ) { parent::__construct($table, $listener); $this->mailService = $mailService; } /** * Create a resource * * @param mixed $data * @return ApiProblem|mixed */ public function create($data) { $dataFiltered = $this->retrieveData($data); $this->table->createUser($dataFiltered); $id = $this->table->getLastInsertValue(); $user = $this->fetch($id); // 调用Mail服务发送注册邮件 $this->mailService->setMessage( $user->email, // 假设用户对象包含email属性 'no-reply@yourdomain.com', // 发件人邮箱 '欢迎注册我们的服务' // 邮件主题 ); $this->mailService->addPart('恭喜您完成注册,开始使用我们的服务吧!', 'text/plain'); $this->mailService->send(); return $user; } }
2. 修改UsersResource的工厂类,注入Mail实例
你提到UsersResource已经有工厂类,现在需要修改它,从服务容器中取出Mail实例并传递给UsersResource的构造函数:
namespace account\V1\Rest\Users; use Psr\Container\ContainerInterface; use account\Core\Mail\Mail; class UsersResourceFactory { public function __invoke(ContainerInterface $container) { // 获取父类DbConnectedResource所需的依赖 $table = $container->get('account\V1\Rest\Users\UsersTable'); $listener = $container->get(\Laminas\ApiTools\ApiProblem\ApiProblemListener::class); // 从容器中获取预配置好的Mail服务 $mailService = $container->get(Mail::class); // 实例化UsersResource并传入所有依赖 return new UsersResource($table, $listener, $mailService); } }
3. 确保Mail服务已在容器中注册
你已经有了MailFactory,只需要在模块配置文件(比如module.config.php)中把Mail类和它的工厂绑定:
return [ 'service_manager' => [ 'factories' => [ \account\Core\Mail\Mail::class => \account\Core\Mail\MailFactory::class, // 其他服务配置... ], ], // 其他模块配置... ];
额外注意:绑定Resource工厂到REST配置
如果你的UsersResource之前用的是默认的DbConnectedResource工厂,需要在api-tools-rest配置中指定自定义的工厂:
'api-tools-rest' => [ 'account\V1\Rest\Users\Controller' => [ 'listener' => 'account\V1\Rest\Users\UsersResource', 'service_name' => 'Users', // 绑定自定义的Resource工厂 'resource_factory' => \account\V1\Rest\Users\UsersResourceFactory::class, // 其他REST配置... ], ],
这样操作完成后,Mail服务就会被正确注入到UsersResource中,你就能在create方法里顺利调用邮件发送逻辑了。
内容的提问来源于stack exchange,提问作者sfeb
相关产品推荐
相关产品推荐

