[Drupal 8] services.yml 說明

本文參考: 1. https://www.drupal.org/docs/8/api/services-and-dependency-injection/structure-of-a-service-file 2. https://symfony.com/doc/3.4/service_container.html

Services 源自於 Symfony,代表的是 有用的物件(object) ,例如 你有一個 Mail 物件(object),它可以在另一個 object 把資料存檔的時候幫你寄信之類的。 而這類型的 Service 會存在於 service container 的特殊object 裡,透過 services.yml 就可以註冊這些 有用的物件 並放進 Drupal 的 servcie container 裡。 後面就可以用類似以下的語法來使用這個Service

$my_service= \Drupal::service('my_mail_service');
$my_service->send_service_mail();

內容大概長這樣(以下程式碼取自user.services.yml):

services:
    access_check.user.role:
    class: Drupal\user\Access\RoleAccessCheck
    tags:
      - { name: access_check, applies_to: _role }

結構說明如下:

  • access_check.user.role 表示 這個Service的名稱,用來讓別人呼叫用的
  • class 與 tags 為 service 的屬性 property,後面說明

Service 的屬性

  • abstract: 表示這個service 沒有真正的作用,僅作為其他 service 的母service。預設值為 false

  • alias: 可設定另一個服務的class,表示這個服務只是另外一個service的別名

  • arguments: 可以傳遞給 另一個 service 的參數, 假設是 factory 則是傳給的factory的 method 或是 一個class的話,則傳給 constructor。參數名稱前面如果有 @,如 @myservice,表示另外一個service; 如果是被 %包圍的,如 %arg1% ,表示是在services.yml中被 parameters 所定義的 參數( parameters 的範例可參考 core.services.yml)相關文件請參閱 這個,和 這個

  • calls: 用來作 setter injection. 當這個service被 實例化後,可以被額外呼叫的 methods 詳見 這裡

  • class: 這個 Service 的 class

  • configurator: 參閱 這個

  • decorates: 用來改寫另一個 service,要注意的是這會取代 service ,可以結合parent 屬性使用,參閱 這個

  • factory: factory可以用來產生其他的service物件,參閱 這個

  • file: 載入這個service前,需要include進來的 檔案

  • parent: 參閱 這個

  • properties: 參閱 這個

  • public: private service 僅能用作為其他service 的argument。預設為 true

  • scope: 定義一個service 實例可以被 container 用多久。 預設是 'container',亦即跟container 同進退。 'prototype' 表示每次使用都要重建。 'request'則是有新的 request 時才建立。

  • synthetic: 表示 這個service 是被注入到 container 的,而不是被container建立的。預設是 true。參閱 這個

  • tags: 用來定義service 的群組。arguments 屬性可以透過tag 一次 注入相關的 service