
【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;
}
}
}
まとめ
処理結果を集約する場所を作ることで、預入先、引出し元が明確になるかなと思いました!
しかもこれ一つあれば、他のクラスからも呼び出し放題!すごっ!!
いやー、ホントすげーなーと感心するばかり!!
早く自分も当たり前にこれぐらいできるようになりたい!
処理のやり方はそれぞれあるけど、やっぱ現場でたくさんソース見てインプットして、それを可能な限りアウトプットすることが大事ですね!
ではまた次の記事でお会いしましょう😎
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ここまで見てくださりありがとうございます。
♡をくださると、次の記事の励みになります!!
こんな内容で困っている、こんなこと知りたいなどご意見があれば
是非是非コメントお待ちしています☆
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<