<?php
/*
* 注入すべきものが増えた構成
* 注入するものをさらに増やしたり変更したりする場合、修正箇所が多くなる
*/
/**************************************************/
// メール送信インターフェイス
interface MailerInterface
{
public function send($body);
}
// ログ記録インターフェイス
interface LoggerInterface
{
public function record($body);
}
/**************************************************/
// Sendmailでメール送信
class SendmailMailer implements MailerInterface
{
public function send($body)
{
echo 'Sendmailで送信しました:' . $body . "\n";
}
}
// SMTPでメール送信
class SmtpMailer implements MailerInterface
{
public function send($body)
{
echo 'SMTPで送信しました:' . $body . "\n";
}
}
/**************************************************/
// ファイルでログ記録
class FileLogger implements LoggerInterface
{
public function record($body)
{
echo 'Fileで記録しました:' . $body . "\n";
}
}
// データベースでログ記録
class DatabaseLogger implements LoggerInterface
{
public function record($body)
{
echo 'Databaseで記録しました:' . $body . "\n";
}
}
/**************************************************/
// ニュースレター送信
class NewsletterTransfer
{
protected $mailer, $logger;
public function __construct(MailerInterface $mailer, LoggerInterface $logger)
{
$this->mailer = $mailer;
$this->logger = $logger;
}
public function send($message)
{
$this->mailer->send($message);
$this->logger->record(date('Y-m-d H:i:s') . ':送信完了');
}
}
/**************************************************/
// 送信処理
$newsletter = new NewsletterTransfer(new SendmailMailer(), new FileLogger());
$newsletter->send('今月のピックアップニュース');
/**************************************************/