0

我对 Laminas API 工具很陌生,我想了解如何将服务正确地注入到我的休息服务中。

例子:

namespace account\V1\Rest\Users;

use Laminas\ApiTools\DbConnectedResource;

class UsersResource extends DbConnectedResource {
    /**
     * 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);
        // send email to user
        return $user;
    }

我需要实现一些东西// send email to user来调用下一个类的发送方法


namespace account\Core\Mail;

class Mail {

    protected $service;
    protected $message;
    protected $body;

    public function __construct(MailgunService $service) {
        $this->service = $service;
        $this->message = new \Laminas\Mail\Message();
        $this->body = new \Laminas\Mime\Message();
    }

    private function updateBody() {
        $this->message->setBody($this->body);
    }

    public function addPart($part, $partType) {
        $mailPart = new \Laminas\Mime\Part($part);
        $mailPart->type = $partType;

        $this->body->addPart($mailPart);

        $this->updateBody();
    }

    public function setMessage($to, $from, $subj) {
        $this->message
                ->setTo($to)
                ->setFrom($from)
                ->setSubject($subj);
    }

    public function send() {
        $this->service->send($message);
    }

}

(Mail 类有一个像下面这样的工厂(也是 UsersResource,但我不知道它是否重要))

namespace account\Core\Mail;

use Psr\Container\ContainerInterface;

class MailFactory
{
    public function __invoke(ContainerInterface $container)
    {
        return new Mail(
                $container->get(\SlmMail\Service\MailgunService::class)
                );
    }
}

我检查了laminas-servicemanager但不知道如何进行,有什么提示吗?

4

1 回答 1

0

如果我理解正确,您想将服务注入邮件类?

这正是工厂的用途:

class Mail {

    protected $service;
    protected $anotherService // new service
    protected $message;
    protected $body;

    public function __construct(
        MailgunService $service,
        AnotherService $anotherService // new service
    ) {
        $this->service = $service;
        $this->anotherService = $anotherService; // new service
        $this->message = new \Laminas\Mail\Message();
        $this->body = new \Laminas\Mime\Message();
    }

// ... rest of class
}

在您的工厂中,您可以像这样注入服务:

class MailFactory
{
    public function __invoke(ContainerInterface $container)
    {
        return new Mail(
            $container->get(\SlmMail\Service\MailgunService::class),
            $container->get(AnotherService::class) // new Service
        );
    }
}

为了让它工作,ServiceManager 需要知道新的服务。并且应该使用 MailFactory 构建 Mail 类

于 2020-09-09T15:31:01.630 回答