在實(shí)際開發(fā)中,我們可能需要在用戶登錄的響應(yīng)中添加額外的信息。例如,假設(shè)我們在用戶配置文件中新增了一個(gè)字段(如名字或年齡),并希望將這些字段的數(shù)據(jù)包含在登錄 API 的響應(yīng)中。
在開始修改響應(yīng)之前,我們需要了解 Drupal 8 的默認(rèn)實(shí)現(xiàn)邏輯。與其他頁面類似,用戶登錄頁面的實(shí)現(xiàn)從路由開始。以下是相關(guān)的路由文件配置:
/user 路由同時(shí)支持 HTML 和 REST 格式的登錄請求。?_format=json 參數(shù)。當(dāng)請求 URL 包含 ?_format=json 時(shí),系統(tǒng)會調(diào)用 REST 控制器來處理登錄請求。默認(rèn)情況下,該控制器會返回一個(gè)標(biāo)準(zhǔn)的 JSON 響應(yīng)。為了實(shí)現(xiàn)自定義響應(yīng),我們需要對該控制器進(jìn)行擴(kuò)展和修改。
由于 Drupal 8 基于面向?qū)ο缶幊蹋∣OP)范式,我們可以通過擴(kuò)展核心控制器來實(shí)現(xiàn)自定義功能。以下是具體步驟:
創(chuàng)建自定義模塊
使用 Drupal Console 工具生成模塊的樣板代碼。例如,我們可以創(chuàng)建一個(gè)名為 rest_login_addons 的模塊。
擴(kuò)展核心控制器
在模塊目錄下創(chuàng)建自定義控制器文件,例如 rest_login_addons/src/Controller。在自定義控制器中,我們需要重寫登錄方法。具體實(shí)現(xiàn)如下:
注意:序列化器服務(wù)是通過依賴注入的方式包含在核心控制器中的。了解依賴注入的實(shí)現(xiàn)方式有助于更好地理解這一過程。
盡管我們已經(jīng)完成了自定義控制器的開發(fā),但默認(rèn)路由仍然指向舊的核心控制器。為了解決這個(gè)問題,我們需要通過事件訂閱器來替換默認(rèn)的控制器。以下是具體步驟:
創(chuàng)建服務(wù)定義文件
在模塊目錄下創(chuàng)建 rest_login_addons.services.yml 文件,并在其中定義服務(wù)類。
實(shí)現(xiàn)路由訂閱器類
創(chuàng)建一個(gè)服務(wù)類,并擴(kuò)展 RouteSubscriberBase 類。在該類中,指定自定義控制器的名稱和方法,以替換默認(rèn)的控制器。
清除緩存
完成上述步驟后,清除緩存以確保路由系統(tǒng)的更改生效。
完成這些操作后,訪問 /user/login?_format=json 時(shí),響應(yīng)中將包含新增的字段數(shù)據(jù)。例如,新增的年齡字段值將顯示在響應(yīng)中。
通過結(jié)合服務(wù)、路由和控制器,我們可以輕松地自定義 Drupal 8 用戶登錄 API 的響應(yīng)內(nèi)容。這種方法不僅可以用來添加字段,還可以用于修改響應(yīng)消息、狀態(tài)碼等。得益于 Drupal 8 的 OOP 設(shè)計(jì),我們能夠以更少的代碼實(shí)現(xiàn)功能擴(kuò)展,從而提高開發(fā)效率。
原文鏈接: https://www.axelerant.com/blog/modify-response-drupal8-user-login-api-endpoint