2014-10-02 24 views
8

Tin nhắn flash có vẻ bị hỏng trong trường hợp chuyển hướng. Tôi đã tạo mã thử nghiệm đơn giản:Yii2 - flash không hiển thị sau khi chuyển hướng

public function actionTest($test = 0) { 
    if($test == 0) { 
     Yii::$app->getSession()->addFlash('success', 'Follow the white rabbit'); 
     return Yii::$app->getResponse()->redirect(array('test', 'test' => 1)); 
    } 
    return $this->render('test', []); 
} 

Tôi gọi hành động không có tham số, nó sẽ thêm đèn flash và chuyển hướng. Khi nó hiển thị trang - flash không xuất hiện.

Phần xem là tốt, bởi vì nếu tôi đặt flash và thực hiện kết xuất mà không cần chuyển hướng, nó sẽ được hiển thị chính xác.

Tại sao?

EDIT: Layout view mã:

<?php 

use frontend\widgets\Alert; 

$this->beginPage(); 
echo $this->render('partials/head'); 
?> 

<body class="no-sidebar"> 
    <?= $this->beginBody() ?> 
    <div id="header"> 
     <?= $this->render('partials/top') ?> 
     <?= $this->render(Yii::$app->user->isGuest ? 'menus/guest' : 'menus/registered') ?> 
    </div> 
    <!-- Main --> 
    <div id="main"> 
     <?= Alert::widget() ?> 
     <?= $content ?> 

    </div> 

    <?= $this->render('partials/footer') ?> 
    <?= $this->endBody() ?> 
</body> 
</html> 

<?php $this->endPage() ?> 

Trả lời

18

Tôi đã gặp lỗi tương tự cho đến khi tôi phát hiện thấy thiếu return trong mã của mình. Vì vậy, với return $this->redirect() nó hoạt động tốt và với $this->redirect nó không hoạt động tốt.

+0

Điều đó có ý nghĩa. Nếu bạn sử dụng chuyển hướng mà không trả lại tập lệnh, nó sẽ hiển thị trang, nó sẽ sử dụng hết các nhấp nháy rồi nó chuyển hướng. Kết quả là một đèn flash bị thiếu trên trang tiếp theo. Vì vậy, đó là hành vi bình thường và mong đợi. –

+0

Người bạn đã cứu thịt xông khói của tôi. Tôi đã dành hàng giờ xung quanh với vấn đề này cho đến khi tôi đọc bình luận của bạn. Sửa nó ngay lập tức. Cảm ơn bạn! –

+0

đẹp, cảm ơn bạn – kiamoz

4

Mã của bạn trông ok, tôi không chắc chắn vấn đề là gì. Bạn có thể thử sử dụng

return $this->redirect(['test', 'test' => 1]); 

Thay vì

return Yii::$app->getResponse()->redirect(array('test', 'test' => 1)); 

Đây là cách hầu hết các ví dụ Yii là. Nhưng mã của bạn có vẻ ổn sau khi xem http://www.yiiframework.com/doc-2.0/yii-web-response.html#redirect()-detail

Bạn có chắc chắn phiên của mình đang hoạt động bình thường và bạn không hủy bất kỳ lúc nào?

này làm việc cho tôi:

public function actionChangeDetails() 
    { 
     $model = Contact::findOne(Yii::$app->user->identity->id); 

     if ($model->load(Yii::$app->request->post()) && $model->save()) { 
      Yii::$app->session->setFlash('success', 'Form Saved'); 
      return Yii::$app->getResponse()->redirect(['my-account/change-details']); 
     } 

     return $this->render('changeDetails', [ 
      'model' => $model, 
     ]); 
    } 
+0

Simple '$ this-> redirect' sẽ làm việc (Tôi đã thử nghiệm nó trong dự án Yii2 mới), nhưng tôi có thể' t làm điều đó trong trường hợp của tôi vì tôi phải trả về đối tượng Response. Tôi hỏi yii2 github và họ không thể tái tạo. Có lẽ đó là một số loại vấn đề phiên nhưng bây giờ rất khó để tìm thấy. Tôi không phá hủy phiên bất cứ nơi nào chắc chắn. – Joe

+0

Dùng thử với Yii mới nhất, có thể bạn không có bản cập nhật. –

+0

Không, tôi đã tạo ứng dụng mới bằng cách sử dụng nhà soạn nhạc. – Joe

1

Trên trang điểm bạn nên thêm: 'từng phiên làm> getFlash (' thành công); ?> 'như được mô tả ở đây: Yii2 Session, Flash messages, khi đó bạn sẽ thấy thông báo flash của mình

0

tôi có một giải pháp

if(Yii::$app->getResponse()->getStatusCode() != 302) { 
    Yii::$app->session->getFlash('error') 
} 
+1

Chào mừng bạn đến với Stack Overflow! Bạn có thể giải thích cách câu trả lời của bạn giải quyết (các) vấn đề từ câu hỏi không? Câu trả lời chỉ có mã không phải là rất hữu ích, đặc biệt là cho độc giả tiếp tục vấp ngã khi đăng bài này. Cảm ơn! – Cristik

1

Thêm return trong bạn redirect

Yii::$app->session->getFlash('key', 'message'); 

return $this->redirect(['yourAction']); 
Các vấn đề liên quan