You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 06:48:15