salesforce零基礎學習(一百零一)如何瞭解你的程式碼得執行上下文

zero.zhang發表於2021-03-05

本篇參考:https://developer.salesforce.com/docs/atlas.en-us.228.0.apexcode.meta/apexcode/apex_enum_System_Quiddity.htm

https://developer.salesforce.com/blogs/2021/01/you-shall-not-pass-quiddity-for-secure-salesforce-development.html

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_with_security_stripInaccessible.htm

背景:不瞭解我的人如果只看過我的部落格,會以為我是一個發亮稀少,或者表情嚴肅的程式狗。但是其實和我做過專案的基本都知道,我是一個年紀輕輕騷話不斷的小逗比。以此為背景,前幾天同事問我說岳奇,我有一段程式碼是公用的邏輯,但是想在trigger和batch都共用到,兩個邏輯差不多,區別就是那麼一小點點。怎樣才能判斷當前這個方法執行的上下文是在trigger裡面還是batch裡面啊。此時的我就和他說:哦我的上帝,先必應,在谷歌,找不到解決方案再找我,我就可以和你很自信的說這個實現不了了,搞定~~~當然,玩笑歸玩笑,本著朋友的信任,基本上朋友問的問題我都知無不言,所以我說,以我幹salesforce 開發5年的經驗來看,這個確實好像實現不了,只能告訴你如果想知道是否batch執行可以System.isBatchable()。我對apex的概念還是有點落後的,之前apex develop guide沒事確實也掃過一遍,當時掃的時候還是V36.0,現在都已經看不到了。

 這幾天物件出差,在家呆著刷劇也無聊,尋思好久沒有看最新release的開發文件了,掃一掃哪些好用的新功能,混個臉熟。結果我發現前幾天的回覆是多麼的無知,特此寫下此篇,告誡自己不要太自負,溫故而知新,說以前先多查查,多確定。

一. Quiddity

Quiddity是salesforce winter21新加的列舉類,apex如果使用,api version需要50及以上。我們通過上面的連線可以看到這個列舉類中包含的列舉元素。元素很多,找幾個單獨說一下:

  • ANONYMOUS: 匿名塊或者develop console執行的程式碼,執行時環境將會是 ANONYMOUS;
  • AURA: 通過aura或者lwc呼叫的程式碼,執行時環境將會是AURA,需要注意的是,目前至少在API 51的版本上,無法區分當前執行的是aura還是lwc,以後有可能會改善吧;
  • BATCH_APEX:當前執行程式碼環境是batch job場景;
  • FUTURE:當前執行程式碼環境是feature場景;
  • QUICK_ACTION:當前執行的程式碼環境是 quick action;
  • REMOTE_ACTION:通常用於classic場景的 remote action;
  • SYNCHRONOUS:通常用於trigger等程式碼同步執行的場景;
  • VF: 通過VF page去觸發的場景。

還有很多其他的列舉元素用於不同的場景,感興趣的自行檢視,那麼如何在apex中獲取當前的列舉呢,更簡單了。只需要通過 Request獲取當前的請求,然後調getQuiddity即可。具體如下:

//Get info about the current request
Request reqInfo = Request.getCurrent();
 
//Get the identifier for this request, which is universally unique
//Same as requestId in splunk or REQUEST_ID in event monitoring
String currentRequestId = reqInfo.getRequestId();
 
//Enum representing how Apex is running. e.g. BULK_API vs LIGHTNING
Quiddity currentType = reqInfo.getQuiddity();
//Use this with a switch statement,
//instead of checking System.isFuture() || System.isQueueable() || ...

通過上面的部落格連結,我們可以對這個功能做更好的擴充,做一個功能閥,保證我們的程式碼只在部分場景執行。可擴充套件性很多,大家可以基於自身的業務去進行使用。下面截圖是上述相似程式碼trigger上下文的apex class的執行結果。

總結:本篇本來還想介紹一下Security的stripInaccessible方法實現sf針對資料訪問許可權的安全化策略,後來過了一遍新的文件,發現還是有好多更新的內容沒有檢視,作罷了越更越多的特性點,還是推薦個人可以自己養成自我學習的習慣。篇中有錯誤歡迎指出,有不懂歡迎留言。自信是好東西,前提是有支撐著你自信的能力,我這次很慚愧。技術不斷的更新變化,擁抱變化,不斷努力。共勉。

相關文章