일반적으로 나는 이것을 달성하기 위해 코드를 다르게 구성하는 것이 좋습니다.
세 가지 양식 작업이 있고 그 중 하나가 다른 두 작업을 수행하는 경우 요구 사항에 따라 다른 방법을 호출하는 세 가지 양식 작업으로 구조화 할 수 있습니다. 예를 들어 '저장', '사용자에게 알림'및 '& 사용자에게 알림'과 같은 세 가지 작업을 원한다고 가정 해 보겠습니다. 내가 지금처럼이 구조 것입니다 :
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