依賴注入模式
想象一下,你有一個類經理來管理髮送郵件(稱為 MailManager)。
在此,你必須記錄傳送的郵件。一個好的解決方案是將 MailManager 類轉換為 service
,然後將用於建立日誌的類(例如 Monolog
)注入到建立服務的 MailManager 中。
去做這個 :
1-將未來的 MailManager 類宣告為服務(在 services.yml 中)
services:
mail.manager.class:
class: Vendor/YourBundle/Manager/MailManager
2- 使用 argument
方法注入 logger existant 服務
services:
mail.manager.class:
class: Project/Bundle/Manager/MailManager
arguments: ["@logger"] # inject logger service into constructor
3-建立 MailManager 類
<?php
namespace Project\Bundle\Manager;
use Symfony\Component\HttpKernel\Log\LoggerInterface;
class MailManager
{
protected $logger;
//initialized logger object
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
public function sendMail($parameters)
{
//some codes to send mail
//example using logger
$this->logger->info('Mail sending');
}
}
4-例如,在 Controller 中呼叫 MailManager
<?php
class TestController extends Controller
{
public function indexAction()
{
//some codes...
//call mail manager service
$mailManager = $this->get('mail.manager.class');
//call 'sendMail' function from this service
$mailManager->sendMail($parameters);
}
}