Доступ к локальным параметрам из сервисов модуля и контроллеров

Я занимаюсь разработкой сайта на основе Zend Framework 3, и в некоторых модулях мне нужно отправлять электронные письма.

Я использую PERL Mail для этого. Он будет направлять все запросы на отправку электронной почты в сервис Amazon SES на производстве, а для разработки я использую бесплатную учетную запись Gmail.

В моем приложении я хочу сохранить конфигурацию почты локально, используя local.php подать project/config/autoload directory, Таким образом, у меня могут быть разные конфигурации как для разработки, так и для производства. Итак, я создал следующие записи на моем local.php файл:

'mail' => [
   'host' => 'ssl://smtp.gmail.com',
   'port' => '465',
   'auth' => true,
   'username' => 'myusername@mydomain.com',
   'password' => 'mypassword',
]

Все хорошо, за исключением того, что я не знаю, как получить эти параметры из сервисов и контроллеров моих модулей.

Вот сервисный пример, который мне нужен для доступа к этому параметру, расположенный в module/User/src/service/UserManagerService:

class UserManager
{
    /**
     * Doctrine entity manager.
     * @var Doctrine\ORM\EntityManager
     */
    private $entityManager;  

    public function __construct($entityManager) 
    {
        $this->entityManager = $entityManager;
    }


    public function addUser($data) 
    {
        **// Need to access the configuration data from here to send email**
    }
}  

Этот сервис имеет фабрику:

<?php
namespace User\Service\Factory;

use Interop\Container\ContainerInterface;
use User\Service\UserManager;

class UserManagerFactory
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {        
        $entityManager = $container->get('doctrine.entitymanager.orm_default');

        return new UserManager($entityManager);
    }
}

Я довольно новичок в этих фабриках, сервисах и контроллерах ZF3, поэтому я немного заблудился здесь.

Как я могу получить параметры, хранящиеся в файле local.php здесь, в этом сервисе? Будет ли такой подход для контроллера таким же?

1 ответ

Решение

Конфигурация хранится в контейнере под Config, Вы можете получить его так же, как вы получаете услугу или что-либо еще из контейнера. Это работает для всего (сервисы, контроллеры), которые вы извлекли из контейнера на фабрике. Рекомендуется извлечь параметры конфигурации внутри фабрики и передать их службе или контроллеру.

Ваша фабрика:

<?php

namespace User\Service\Factory;

use Interop\Container\ContainerInterface;
use User\Service\UserManager;

class UserManagerFactory
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        $entityManager = $container->get('doctrine.entitymanager.orm_default');
        $config = $container->get('Config');

        return new UserManager($entityManager, $config['mail']);

        /* Or write this as:
        return new UserManager(
            $container->get('doctrine.entitymanager.orm_default'), 
            $container->get('Config')['mail']
        );
        */
    }
}

Ваш сервис:

<?php

use Doctrine\ORM\EntityManager

class UserManager
{
    /**
     * @var EntityManager
     */
    private $entityManager;

    /**
     * @var array
     */
    private $mailConfig;

    public function __construct(EntityManager $entityManager, array $mailConfig)
    {
        $this->entityManager = $entityManager;
        $this->mailConfig = $mailConfig;
    }

    public function addUser($data)
    {
        var_dump($this->mailConfig);
    }
}
Другие вопросы по тегам