2

我的控制器中有以下代码:

class ContactsController extends AppController {
    public $helpers = array('Html', 'Form', 'Session');
    public $components = array('Session');

    public function index() {
        $this->set('contacts', $this->Contact->find('all'));
    }

    public function view($id) {
        if (!$id) {
            throw new NotFoundException(__('Invalid contact'));
        }

        $contact = $this->Contact->findById($id);
        if (!$contact) {
            throw new NotFoundException(__('Invalid contact'));
        }
        $this->set('contact', $contact);
    }

    public function add() {                 
        if ($this->request->is('post')) {
            $this->Contact->create();
            if ($this->Contact->save($this->request->data)) {
                $this->Session->setFlash('Your contact has been saved.');
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash('Unable to add your contact.');
            }
        }
    }
}

在 add() 方法中,$this->redirect(array('action' => 'index'));我希望这条线在我的视图中重定向回我的索引页面。但我得到的只是一张空白的白页。

任何帮助表示赞赏。

问候,斯蒂芬

4

2 回答 2

18

您的代码看起来有效;我在您提供的代码中没有看到错误。

有几个可能的原因;

  • 您的代码中的其他地方有错误,但是 cake php 不输出错误消息,因为调试被禁用。通过在内部将调试设置为 1 或 2 来启用调试app/Config/core.php-Configure::write('debug', 2);
  • 在发送重定向标头之前,您的应用程序正在向浏览器输出某些内容。<?php这可能是由任何or之前或之后的(不可见的)空白引起的?>。这将导致“标头已发送”警告,并且浏览器不会重定向。StackOverflow 上有很多关于这种情况的问题,例如:How to fix "Headers already sent" error in PHP

笔记; return在 CakePHP 中,在任何重定向语句之前放置一个良好的做法;这将允许对您的应用程序进行更好的单元测试,即:

return $this->redirect(array('action' => 'index'));

更新; 查找原因的附加“指针”

跟踪这类问题可能比较麻烦,我再补充一些指点

  • 如果您正在使用AuthorSecurity组件,则其中之一可能会导致“问题”(例如,授权失败或发布的数据被标记为“无效”,这将由“blackHole()”回调处理。禁用两者您的 AppController 检查问题是否仍然存在
  • 如果问题仍然存在,可能正在发送标头(如前所述),但没有出现警告/错误。要查找这些标头是否发送以及发送位置,请将此代码添加到您的“添加”操作中;

调试代码:

if (headers_sent($file, $line)) {
    exit("headers were already sent in file: {$file}, line number: {$line}");
}
于 2013-04-21T11:03:04.967 回答
6

经过大量研究,我终于找到了解决方案。

请用

ob_start();AppController.php

ob_start();
class AppController extends Controller {
     function beforeFilter() {
         parent::beforeFilter();
     }
}
于 2015-08-17T05:03:29.950 回答