見出し画像

【Auraコンポーネント】サーバ側コントローラーの応用を学ぶ

こんにちは!
最近調査系の仕事ばかりで、プログラミングしたい症候群を発症中のぶっちーです!

みなさんはAuraコンポーネントでどんな機能を作っていますか?
僕は「クイックアクション」を作成することが多いです。

作成するアクションには様々な条件やを処理が必要になるので、サーバ側コントローラーにそれらを書いていくわけですが、ここで研修と現場の大きな違いを体験することになりました!

returnは単なるワン・ツーじゃない!

Tailheadの「JavaScript ボタンの Lightning の代替法」モジュールの「Lightning アクションについて」単元で使用されているサーバ側コントローラーが最初に習う良き例だと思います!

この単元のChallengeで使用するサーバ側コントローラーでは、getAccountメソッドで、引数としてAuraから取引先objのレコードIDを受け取り、returnでレコードIDに紐づく取引先情報をクエリして返しています。

//Challengeで使用するサーバ側コントローラー

public with sharing class QuickContactController {

   @AuraEnabled
   public static Account getAccount(Id accountId) {
       // Perform isAccessible() checks here
       return [SELECT Name, BillingCity, BillingState FROM Account WHERE Id = :accountId];
   }
   
   @AuraEnabled
   public static Contact saveContactWithAccount(Contact contact, Id accountId) {
       // Perform isAccessible() and isUpdateable() checks here
       contact.AccountId = accountId;
       upsert contact;
       return contact;
   }

}


Trailheadで学んできた僕はこれを正義としていましたが、現場に入り、僕が学んでいたのはまだ『This is a Pen.』だけだと気付かされました。。。

サッカーのワン・ツーのように簡単にreturnするだけではなかったのです!Trailheadじゃ教えてくれないそこんトコロ!!


処理結果を受け取る隠れたコントローラー

処理結果を受け取る用のコントローラーを用意することで、サーバ側コントローラーで処理を行なった際に、処理が成功なのかエラーなのかによって値を設定しなおします!

例えば商談のフェーズを更新するAuraコンポーネントの「Oppotunity_QuikcAction」コントローラーの処理があった場合、
処理結果が”別のApex(ResponseController)”へ渡され、また別のメソッドでResponseControllerから成功時、エラー時のデータを受け取り後続処理を書くなどできます!


// 商談のフェーズを更新するサーバ側コントローラー

public with sharing class Oppotunity_QuikcAction extends ControllerUtils{
   
   @AuraEnabled
   public static Responce updateStageName(Id recordId){
       
       // 受け取ったIDの商談をクエリ
       List<Opportunity> opp = new List<Opportunity>();
       opp = [select Id, Name, StageName from Opportunity where Id =:recordId ];
               
       try{
           if(opp[0].StageName != '完了' || opp[0].StageName != '不成立' ){
               opp[0].StageName = '完了';
               update opp;
           }
       } catch(DmlException e) {
           String ErrorMessage =  'フェーズが更新できません';
           return new ErrorData(ErrorMessage);
       }
       
       return new SuccessData(opp[0]);

   }
   
   @AuraEnabled
   public static Responce ・・・・・{
       //
   }
   
}


// Responceを受け取る用のコントローラー

public abstract class ResponseController {
   
   public interface Responce {  
   }

   //処理が成功したときにのクラス
   public class SuccessData implements Responce {
       @AuraEnabled public Boolean success { get; set; }
       @AuraEnabled public Object obj { get; set; }
       
       //返却用データ
       public SuccessData(Object obj){
           this.success = true;
           this.obj = obj;
       }
       
   }
   
   //エラーが発生した時のクラス
   public class ErrorData implements Responce {
       @AuraEnabled public Boolean success { get; set; }
       @AuraEnabled public Boolean Error { get; set; }
       @AuraEnabled public String ErrorMessage { get; set; }
       @AuraEnabled public Object obj { get; set; }
       
       public ErrorRData(String ErrorMessage) {
           this.success = false;
           this.Error = true;
           this.obj = null;
           this.ErrorMessage = ErrorMessage;
       }
       
   }
   
}


まとめ

処理結果を集約する場所を作ることで、預入先、引出し元が明確になるかなと思いました!
しかもこれ一つあれば、他のクラスからも呼び出し放題!すごっ!!

いやー、ホントすげーなーと感心するばかり!!
早く自分も当たり前にこれぐらいできるようになりたい!

処理のやり方はそれぞれあるけど、やっぱ現場でたくさんソース見てインプットして、それを可能な限りアウトプットすることが大事ですね!


ではまた次の記事でお会いしましょう😎

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

ここまで見てくださりありがとうございます。

♡をくださると、次の記事の励みになります!!

こんな内容で困っている、こんなこと知りたいなどご意見があれば
是非是非コメントお待ちしています☆

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


この記事が気に入ったらサポートをしてみませんか?