从模块服务和控制器访问本地参数
Access local parameters from module services and controllers
我正在开发一个基于 Zend Framework 3 的站点,在某些模块中我需要发送电子邮件。
我正在使用 PERL Mail 这样做。它将在生产环境中将所有电子邮件发送请求转发到 Amazon SES 服务,而为了开发,我使用免费的 gmail 帐户。
在我的应用程序中,我想使用 project/config/autoload directory
处的 local.php
文件以本地方式存储邮件配置。这样我就可以为开发和生产提供不同的配置。因此,我在 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 文件中的参数?
这种方法对于控制器是否相同?
配置存储在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);
}
}
我正在开发一个基于 Zend Framework 3 的站点,在某些模块中我需要发送电子邮件。
我正在使用 PERL Mail 这样做。它将在生产环境中将所有电子邮件发送请求转发到 Amazon SES 服务,而为了开发,我使用免费的 gmail 帐户。
在我的应用程序中,我想使用 project/config/autoload directory
处的 local.php
文件以本地方式存储邮件配置。这样我就可以为开发和生产提供不同的配置。因此,我在 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 文件中的参数? 这种方法对于控制器是否相同?
配置存储在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);
}
}