Доступ к локальным параметрам из сервисов модуля и контроллеров
Я занимаюсь разработкой сайта на основе 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);
}
}