在這個章節中,我們會延續使用第九章服務抽象化的程式碼,請實作過第九章的讀者繼續保持你的本地環境;若你是還沒實作過第九章內容的讀者,建議你重回上一章了解 Anser 是透過何種設計方式將微服務進行抽象化與管理。
首先,先將 Command Line 定位至 Main Service 專案根目錄,並透過 docker compose exec app bash
進入到專案的 docker 容器之中。
接著,使用以下指令安裝 anser
程式庫。
composer require sdpmlab/anser
Anser 程式庫會安裝 Anser 本身與 Anser-Action 程式庫,與一些
順利的話,你會看到以下畫面響應,等待它們安裝完畢即可。
在你的本地環境內建立 UserLoginOrchestrator.php
,並貼上以下內容:
<?php
namespace Orchestrators;
require_once './UserService.php';
use SDPMlab\Anser\Orchestration\Orchestrator;
use Services\UserService;
class UserLoginOrchestrator extends Orchestrator
{
protected $userService;
public function __construct()
{
$this->userService = new UserService();
}
protected function definition(string $email = "", string $password = "")
{
$this->setStep()
->addAction('login', $this->userService->userLoginAction($email, $password));
$this->setStep()
->addAction('info', static function(UserLoginOrchestrator $runtimeOrch){
$data = $runtimeOrch->getStepAction('login')->getMeaningData();
return $runtimeOrch->userService->userInfoAction($data['token']);
});
$this->setStep()
->addAction('wallet', static function(UserLoginOrchestrator $runtimeOrch){
$data = $runtimeOrch->getStepAction('info')->getMeaningData();
return $runtimeOrch->userService->walletAction($data['data']['u_key']);
});
}
protected function defineResult(): array
{
$data = [
"token" => $this->getStepAction('login')->getMeaningData()['token'],
"userData" => $this->getStepAction('info')->getMeaningData()['data'],
"walletInfo" => $this->getStepAction('wallet')->getMeaningData()['data']
];
return $data;
}
}
在 UserLoginOrchestrator
類別中,主要是示範使用者登入後產生的一系列連鎖過程,包括登入、獲取使用者資訊和錢包餘額:
UserLoginOrchestrator
類別繼承了 Orchestrator
類別。這意味著它具有 Orchestrator
所提供的所有功能和方法。$userService
,並在建構子中,初始化 $userService
屬性為 UserService
的一個實體。definition
方法定義了整個協作過程。此方法需要傳入電子郵件和密碼作為參數,用於用戶登入。所有在 definition
提到的微服務都依賴 $userService
定義好的 Actions。defineResult
方法根據協作器的執行結果,組合與回傳整理好的結果。整體來看,我們定義了一個完整的使用者登入流程,這流程將被依據順序執行,每個步驟的結果都會被儲存,並在流程結束後組合成最終的結果。
接著,我們改寫第九章的 userlogin.php
:
<?php
require_once './init.php';
require_once './UserLoginOrchestrator.php';
use Orchestrators\UserLoginOrchestrator;
$userOrch = new UserLoginOrchestrator();
$result = $userOrch->build($_POST['email'], $_POST['password']);
header("Content-Type: application/json");
echo json_encode($result);
使用 Postman 呼叫一次上述 PHP 來看看結果:
我們使用了更有組織性的結構闡述了具有順序性的過程,雖然在這個章節中我們尚未細緻地解釋所有 Orchestrator
類別的可以方法,以及詳細闡述撰寫這些程式碼的用意。但你應該能在這個類別中一目了然整體的業務邏輯,就像文章開頭闡述的那樣,透過程式碼清晰地表達你的業務邏輯。
在這篇文章中我們提供了一個簡短的範例展示協作器的撰寫風格。
我們希望 Anser-Orchestration 元件能夠為開發者提供了一個組織性強、模組化且有順序性的方式來描述多個服務間的互動過程。再接下來的幾個章節中,我們將會深入地探討 Anser-Orchestration 所提供的功能。