依賴注入模式

想象一下,你有一個類經理來管理髮送郵件(稱為 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);
        
    }
}