拡張コントローラーは複数設置できる!?
VisualForceページで拡張コントローラーを使用する場合、apex:pageタグのextensionsで拡張コントローラを指定できます。
実は、拡張コントローラーはカンマ区切りで指定することができるんです。
メソッド名が重複してたらどうなるか?
実際に簡単なVisualForceページと拡張コントローラーを作成して検証しました。
VisualForceページ
AccountMultiExtention.page
<apex:page standardController="Account" extensions="AccountExtCtrl1,AccountExtCtrl2">
<apex:form >
<apex:inputField value="{!Account.Name}"/>
<apex:commandButton action="{!save}" value="Save" />
</apex:form>
</apex:page>
拡張コントローラー1
AccountExtCtrl1.cls
public class AccountExtCtrl1 {
public AccountExtCtrl1(ApexPages.StandardController controller) {
}
public PageReference save(){
System.debug('AccountExtCtrl1');
return null;
}
}
拡張コントローラー2(単純に1が2になっただけです)
AccountExtCtrl2.cls
public class AccountExtCtrl2 {
public AccountExtCtrl2(ApexPages.StandardController controller) {
}
public PageReference save(){
System.debug('AccountExtCtrl2');
return null;
}
}
ここで、ポイントはapex:commandButtonのところにあるsaveメソッド。
standardControllerにもsaveメソッドが実装されている上、2つの拡張コントローラーにもsaveメソッドが存在しています。
では問題です。
ボタンを押した時に、どのメソッドが実行されるでしょうか?
選択肢は以下の5つ。
- standardControllerのsave(レコードの保存)
- AccountExtCtrl1のsaveメソッド
- AccountExtCtrl2のsaveメソッド
- AccountExtCtrl1とAccountExtCtrl2の両方のsaveメソッド
- standardController、AccountExtCtrl1、AccountExtCtrl2すべてのsaveメソッド
実際に動作を確認
では、実際に「Save」ボタンを押してみましょう。
デバッグログがこのように出力されます。
AccountExtCtrl1
レコードは保存されておらず、AccountExtCtrl1のsaveメソッドのみが実行されていました。
つまり、2が正解です!
まとめ
検証結果をまとめるとこうなります。
- 標準コントローラーと拡張コントローラーでは、拡張コントローラーのメソッドが優先される
- 拡張コントローラーが複数指定された場合は、最初に指定した拡張コントローラのメソッドが優先される
- 実行されるのは1つのメソッドのみで、他の同名のメソッドは実行されない
まあ、普段の業務でこういう実装することはないんだけどね。。。
あくまでテスト対策ということで押さえておいてください。


コメント