首页 文章

从模块服务和控制器访问本地参数

提问于
浏览
0

我正在开发一个基于Zend Framework 3的站点,在某些模块中我需要发送电子邮件 .

我正在使用PERL Mail这样做 . 它将在 生产环境 时向所有电子邮件发送请求发送给Amazon SES服务,并且我将使用免费的Gmail帐户进行开发 .

在我的应用程序中,我想使用 project/config/autoload directorylocal.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文件中存储的参数?对于控制器,这种方法是否相同?

1 回答

  • 2

    配置存储在 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);
        }
    }
    

相关问题