通常我會建議以不同的方式構建您的代碼來實現此目的。
如果您有三個表單操作,其中一個執行另外兩個操作,則可以將其構造爲三個表單操作,根據需要調用不同的方法。例如,假設您需要三項操作 - 「保存」,「通知用戶」和「保存&通知用戶」。我想構建這樣像這樣:
class Page_Controller extends ContentController {
public function Form() {
$actions = new ArrayList([
new FormAction('save', 'Save'),
new FormAction('notify', 'Notify users'),
new FormAction('saveandnotify', 'Save & Notify users')
]);
return new Form($this, 'Form', $fields, $actions);
}
public function save($data, Form $form) {
if($this->doSave($data, $form)) {
$form->sessionMessage('Save successful', 'good');
} else {
$form->sessionMessage('Failed to save', 'bad');
}
return $this->redirectBack();
}
public function notify($data, Form $form) {
if($this->doNotify($data, $form)) {
$form->sessionMessage('Notified users successfully', 'good');
} else {
$form->sessionMessage('Failed to notify users', 'bad');
}
return $this->redirectBack();
}
public function saveandnotify($data, Form $form) {
// First, attempt save
if($this->doSave($data, $form)) {
// Successful, so now notify users
if($this->doNotify($data, $form)) {
$form->sessionMessage('Saved and notified users', 'good');
} else {
$form->sessionMessage('Saved, but unable to notify users', 'bad');
}
} else {
$form->sessionMessage('Unable to save or notify users', 'bad');
}
return $this->redirectBack();
}
/**
* Saves data from a form submission.
* @return bool true if save was successful, false if it failed
*/
public function doSave($data, Form $form) {
// ... your code here ...
}
/**
* Notify users based on a form submission.
* @return bool true if notification was successful, false if it failed
*/
public function doNotify($data, Form $form) {
// ... your code here ...
}
}
這種分離形式的行動處理和實際的業務邏輯,這也可以讓你更方便地測試業務邏輯,而無需執行完整的提交表單之間的關注點(只創建一個Form
對象,設置值,然後運行測試)。
它還允許您將業務邏輯轉移到單獨的類中,一旦單個頁面控制器無法處理它變得太複雜。在這一點上,我通常會看到「服務」對象,它們將各種業務功能作爲單獨的解耦類來提供。
編輯:我也看到你在這兩個獨立的課上有這些形式。我認爲這是兩個獨立的Form
類或兩個不同的頁面類型?在這種情況下,擁有一個服務類會有所幫助 - 這意味着您可以在所有頁面類型中引用相同的邏輯(在我的情況下爲doSave
和doNotify
),並且知道每次都會得到相同的邏輯。
HTH!
是否有任何理由需要兩種形式?你不能只用一種形式做同樣的事嗎? – bummzack
他們目前在2個頁面上,但我希望他們都在1頁上,以保存用戶額外的點擊。他們是不同的實體,所以他們不能在同一個表中工作。將需要分開。 – Craig
但是,你的動作處理程序都採用與輸入相同的數據,對吧?或者如果用戶沒有機會填寫內容,應該如何填充第二個表單數據?也許你應該澄清你的問題... – bummzack