搜尋
首頁後端開發php教程創建專注的領域應用程式。 Symfony 方法(管理驗證錯誤)

Creating focused domain applications. A Symfony approach (Managing validation errors)

介紹

在上一篇文章中,我們分析了 symfony 序列化器和驗證器元件如何充當基礎設施服務,為我們提供幫助我們在應用程式中執行常見任務的工具。我們也了解了為什麼 UserInputDTO 類別是屬於我們網域的元素,因為它包含業務規則以及如何建立應用程式層服務來執行提取和驗證資料流。

在第二部分中,我們將了解如何管理驗證錯誤,並且正如我們在第一部分中所做的那樣,我們將識別哪些部分屬於該網域。

驗證錯誤

依照使用驗證約束建立的規則驗證 UserInputDTO 後,Symfony 驗證器元件將傳回驗證錯誤。

public function processData(string $content, string $dtoClass): object
{
     $requestData = json_decode($content, true);
     $userInputDTO = $serializer->denormalize($requestData, UserInputDTO::class);
     $errors = $validator->validate($userInputDTO);
     if(count($errors) > 0) {
         throw new ValidationFailedException($errors);
     }

     return $userInputDTO
}

如您在上面的程式碼中所看到的,如果驗證方法發現錯誤,則會拋出 ValidationException 類型的例外。從這裡開始,我們必須決定如何向使用者顯示錯誤(網域/業務規則)以及我們將依賴哪些工具以便錯誤正確地到達使用者(基礎設施和應用程式)。

集中捕獲驗證錯誤

我們必須考慮的第一件事是,我們希望在驗證錯誤發生時捕獲它們。為了實現這一目標,我們將依賴基礎設施層。
Symfony 核心附帶了一組內建核心事件來監聽特殊事件。其中一個事件是內核異常事件,當拋出異常時會觸發該事件。讓我們用它來捕獲 ValidationException 錯誤。

class KernelSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            KernelEvents::EXCEPTION => 'onException'
        ];
    }

    public function onException(ExceptionEvent $event): void
    {
        $exception = $event->getThrowable();
        if($exception instanceof ValidationFailedException){
            // Business rules to build the errors
        }
    }
}

正如我們在上面的程式碼中所看到的,KernelSubscriber 不斷監聽KernelException 事件,並且僅當捕獲的異常是 ValidationFailedException 類。 從這裡開始,我們必須定義當
onException 方法偵測到這是一個驗證錯誤時將執行的邏輯。

建立域服務來建構錯誤數組

由於我們負責決定如何建置錯誤(我們定義這些業務規則),因此執行邏輯的服務將屬於我們的網域。讓我們來編碼吧


class ValidationErrorsBuilder {

    public function buildErrors(ValidationFailedException $exception): array
    {
        $errors = [];
        foreach ($exception->getViolations() as $violation) {
            $errors[$violation->getPropertyPath()] = $violation->getMessage();
        }

        return $errors;
    }
}

ValidationErrorsBuilder 程式碼非常簡單:它循環違規錯誤並建立一個關聯數組,其中鍵是產生錯誤的屬性,值是錯誤訊息。

使用 ValidationErrorsBuilder

現在是時候使用我們的 ValidationErrorsBuilder 網域服務了。我們在 KernelSubscriber onException 方法上使用它。

public function processData(string $content, string $dtoClass): object
{
     $requestData = json_decode($content, true);
     $userInputDTO = $serializer->denormalize($requestData, UserInputDTO::class);
     $errors = $validator->validate($userInputDTO);
     if(count($errors) > 0) {
         throw new ValidationFailedException($errors);
     }

     return $userInputDTO
}

如您所見,在知道異常是 ValidationFailedException 後,我們使用網域服務來取得驗證錯誤陣列。
現在,讓我們來看看下面的程式碼:

class KernelSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            KernelEvents::EXCEPTION => 'onException'
        ];
    }

    public function onException(ExceptionEvent $event): void
    {
        $exception = $event->getThrowable();
        if($exception instanceof ValidationFailedException){
            // Business rules to build the errors
        }
    }
}

我們新增了新行,在其中設定 Symfony JsonResponse 將錯誤陣列儲存為新回應,並指定傳回的 HTTP 程式碼將是 400 Bad Request。
我們依賴 Symfony Response HTTP_BAD_REQUEST 常數來指定回應 HTTP 程式碼。由於我們在以網域為中心的環境中工作,因此我們可以建立自訂網域類別(例如php 枚舉),但是,由於我們只需要處理標準HTTP 程式碼並且沒有特定的自訂需求,因此我們可以使用Symfony HTTP 程式碼雖然這讓我們更依賴這個框架。

那麼應用層呢?

到目前為止我們還沒有討論應用層。我們在文章一開始就說過,Symfony 框架附帶了一個有用的內建事件,例如我們使用的事件:核心異常事件。此外,symfony框架也為我們提供了EventSubscriberInterface,透過它我們可以建立自訂事件訂閱者並監聽我們需要的事件。
從這些資訊中,我們可以得出結論,symfony 為我們提供了內核異常事件和 EventSubscriberInterface 但我們必須使用該介面來建立訂閱者,指定我們要監聽哪些事件。讓我們繼續:

  • 事件訂閱者指定我們監聽內核異常事件。
  • 事件訂閱者檢查異常是否為 ValidationFailedException.
  • 的實例
  • 事件訂閱者使用網域服務來建立錯誤陣列。
  • 事件訂閱者建立包含錯誤的 JsonResponse 並將其設定為最終回應。

這聽起來很熟悉嗎?是的,事件訂閱者負責在拋出異常後管理驗證錯誤的編排和協調,因此我們可以說事件訂閱者將充當應用程式服務。
如果我們想更進一步,我們可以建立一個應用程式層服務並在訂閱者中使用它。

class ValidationErrorsBuilder {

    public function buildErrors(ValidationFailedException $exception): array
    {
        $errors = [];
        foreach ($exception->getViolations() as $violation) {
            $errors[$violation->getPropertyPath()] = $violation->getMessage();
        }

        return $errors;
    }
}
public function onException(ExceptionEvent $event): void
{
    $exception = $event->getThrowable();
    if($exception instanceof ValidationFailedException){
       $errors = $this->validationErrorsBuilder->buildErrors($exception);
    }
}

現在,ValidationErrorsProcessor 將充當協調驗證錯誤回應管理並使用 ValidationErrorsBuilder 網域服務的應用程式服務。

結論

在本系列的第二篇文章中,我們已經確定了驗證錯誤管理過程的哪些元件屬於該網域、我們使用了基礎設施的哪些元素以及核心訂閱者如何充當應用程式服務。
下一篇我們將實體持久化到資料庫中,並分析如何分離將DTO轉換為可持久化實體的邏輯。

以上是創建專注的領域應用程式。 Symfony 方法(管理驗證錯誤)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
高流量網站的PHP性能調整高流量網站的PHP性能調整May 14, 2025 am 12:13 AM

TheSecretTokeEpingAphp-PowerEdwebSiterUnningSmoothlyShyunderHeavyLoadInVolvOLVOLVOLDEVERSALKEYSTRATICES:1)emplactopCodeCachingWithOpcachingWithOpCacheToreCescriptexecution Time,2)使用atabasequercachingCachingCachingWithRedataBasEndataBaseLeSendataBaseLoad,3)

PHP中的依賴注入:初學者的代碼示例PHP中的依賴注入:初學者的代碼示例May 14, 2025 am 12:08 AM

你應該關心DependencyInjection(DI),因為它能讓你的代碼更清晰、更易維護。 1)DI通過解耦類,使其更模塊化,2)提高了測試的便捷性和代碼的靈活性,3)使用DI容器可以管理複雜的依賴關係,但要注意性能影響和循環依賴問題,4)最佳實踐是依賴於抽象接口,實現鬆散耦合。

PHP性能:是否可以優化應用程序?PHP性能:是否可以優化應用程序?May 14, 2025 am 12:04 AM

是的,優化papplicationispossibleandessential.1)empartcachingingcachingusedapcutorediucedsatabaseload.2)優化的atabaseswithexing,高效Quereteries,and ConconnectionPooling.3)EnhanceCodeWithBuilt-unctions,避免使用,避免使用ingglobalalairaiables,並避免使用

PHP性能優化:最終指南PHP性能優化:最終指南May 14, 2025 am 12:02 AM

theKeyStrategiestosigantificallyBoostPhpaPplicationPerformenCeare:1)UseOpCodeCachingLikeLikeLikeLikeLikeCacheToreDuceExecutiontime,2)優化AtabaseInteractionswithPreparedStateTementStatementStatementAndProperIndexing,3)配置

PHP依賴注入容器:快速啟動PHP依賴注入容器:快速啟動May 13, 2025 am 12:11 AM

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增強codemodocultion,可驗證性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

PHP中的依賴注入與服務定位器PHP中的依賴注入與服務定位器May 13, 2025 am 12:10 AM

選擇DependencyInjection(DI)用於大型應用,ServiceLocator適合小型項目或原型。 1)DI通過構造函數注入依賴,提高代碼的測試性和模塊化。 2)ServiceLocator通過中心註冊獲取服務,方便但可能導致代碼耦合度增加。

PHP性能優化策略。PHP性能優化策略。May 13, 2025 am 12:06 AM

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)啟用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替換loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

PHP電子郵件驗證:確保正確發送電子郵件PHP電子郵件驗證:確保正確發送電子郵件May 13, 2025 am 12:06 AM

phpemailvalidation invoLvesthreesteps:1)格式化進行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。