플래시 메시지가 표시되지 않으면 수동 렌더링을 사용하십시오

12544 단어 CakePHPtech
2013-10-21에서 Qita에 기고한 글의 아카이브입니다.본문의 링크가 때때로 실행되지 않습니다.
CakePHP플래시 메시지는 Controller 클래스$this->Session->setFlash('Message')에서 처리 성공 여부 등을 출력할 수 있는 편리한 기능이지만 학급 규모가 커지면서 방법의 분할 등이 시작되면 정상적으로 표시되지 않는다.푹 빠져서 해결책을 적어놓을게요.
### 문제가 발생한 경우
public function add() {
    if ($this->request->is('post')) {
        if ($this->Post->save($this->request->data)) {
            $this->Session->setFlash('Success!');
            $this->redirect(array('action'=>'index'));
        } else {
            $this->Session->setFlash('Failed!');
        }
    }
}
이렇게 add()만 완성하면 문제없다.이 소스는 비대해져서 다음과 같이 되면 문제가 생길 수 있다.
public function add() {

    /* 何らかの処理 */

    if ($this->request->is('post')) {
        $this->_otherMethod();
    }
}

protected function _otherMethod() {

    /* 何らかの処理 */

    if ($this->Post->save($this->request->data)) {
        $this->Session->setFlash('Success!');
        $this->redirect(array('action'=>'index'));
    } else {
        $this->Session->setFlash('Failed!');
    }
}
이 상태에서 add()의 처리에서 _otherMethod()의 처리로 옮길 때 먼저 재현한다.
setFlash() 조작 전에 default.ctp를 호출하기 때문에 플래시 메시지를 출력하지 않는다는 것이다.
### 해결 방법
처리_otherMethod()가 완료되면 렌더링하는 것이 좋습니다. 따라서 자동 렌더링을 해제해야 합니다.
public function add() {
    $this->autoRender = false; // この行を追加

    /* 何らかの処理 */

    if ($this->request->is('post')) {
        $this->_otherMethod();
    }
}

protected function _otherMethod() {

    /* 何らかの処理 */

    if ($this->Post->save($this->request->data)) {
        $this->Session->setFlash('Success!');
        $this->autoRender = true; // この行を追加
        $this->redirect(array('action'=>'index'));
    } else {
        $this->Session->setFlash('Failed!');
        $this->autoRender = true; // この行を追加
    }
}
처리 전후 작업$this->autoRender을 하면 원하는 처리 순서와 출력에 따른다.

좋은 웹페이지 즐겨찾기