我想创建一个简单的类,将预定义的电子邮件发送到给定的电子邮件地址。所以我创建了以下类:
namespace Custom;
use Zend\Mail\Message;
use Zend\Mail\Transport\Smtp as SmtpTransport;
use Zend\Mail\Transport\SmtpOptions;
class Notification
{
public function sendEmailNotification($to)
{
try {
$message = new Message();
$message->addTo($to)
->addFrom('test@example.com')
->setSubject('Hello')
->setBody('Predefined email body');
$transport = new SmtpTransport();
$options = new SmtpOptions(array(
'name' => 'smtp.example.com',
'host' => 'smtp.example.com',
'port' => '587',
'connection_class' => 'plain',
'connection_config' => array(
'username' => 'test@example.com',
'password' => 'somepasswd',
'ssl' => 'tls',
),
));
$transport->setOptions($options);
$transport->send($message);
} catch (\Exception $e) {
echo $e->getMessage();
}
}
}
然后从控制器发送电子邮件:
$notification = new \Custom\Notification();
$notification->sendEmailNotification('example@example.com');
这可以按预期工作。
我想要做的下一件事是将邮件服务器配置参数移动到项目配置文件(local.php
)中。问题是 - 如何在我的\ Custom \ Notification类(不是控制器)中获取配置参数?
到目前为止,我发现的解决方案对于像我这样的初学者来说似乎太复杂了。要做$config = $this->getServiceLocator()->get('Config');
这样的事情,你必须在项目周围做一些魔术。
是否有一种从自定义类中的配置文件中获取数据的简单方法?
答案 0 :(得分:3)
您必须使用注射剂。只需为控制器创建一个工厂,在其中将配置注入控制器。
namespace Application\Controller\Service;
class YourControllerFactory
{
public function __invoke(ContainerInterface $container)
{
$serviceLocator = $container->getServiceLocator();
$config = $serviceLocator->get('config');
$controller = new YourController($config);
return $controller;
}
}
为此,您的控制器需要一个构造函数,该构造函数将config作为参数。
namespace Application\Controller;
class YourController extends AbstractActionController
{
protected $config;
public function __construct($config)
{
$this->config = $config;
}
public function indexAction()
{
// inject your notification class with the config
$notification = new \Custom\Notification($this->config);
$notification->sendEmailNotification('example@example.com');
}
}
因此,您的通知类需要一个构造函数,该构造函数将config作为参数。
解决问题的另一种方法是将通知类注册为服务。只需为您的通知类创建一个工厂,您可以在其中创建所需的所有内容,然后将其注入通知类。
namespace Application\Mail;
class Notification
{
protected $config;
public function __construct($config)
{
$this->config = $config;
}
public function sendEmailNotification($to)
{
}
}
工厂本身很简单,因为我们在控制器工厂看到了几乎相同的方法。
namespace Application\Mail\Service;
class NotificationFactory
{
public function __invoke(ContainerInterface $container)
{
$config = $container->get('config');
$notification = new Notification($config);
return $notification;
}
}
现在您只需在服务管理器部分的module.config.php
文件中记下它。
'service_manager' => [
'factories' => [
Notification::class => NotificationFactory::class,
],
],
从现在开始,您可以使用zend framework 2的服务容器访问通知类。还记得上面显示的控制器实例的工厂吗?而不是将配置注入您的控制器,只需将其注入通知本身。将通过通知工厂使用所需的配置创建通知类。
namespace Application\Controller\Service;
class YourControllerFactory
{
public function __invoke(ContainerInterface $container)
{
$serviceLocator = $container->getServiceLocator();
$notification = $serviceLocator->get(Notification::class);
return new YourController($notification);
}
}
玩得开心。 ;)