CakePHP:重定向不起作用

时间:2013-04-21 10:42:08

标签: cakephp

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

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'));我希望这一行能够在我的视图中重定向回我的索引页面。但我得到的只是一个空白的白页。

任何帮助表示感谢。

此致 斯蒂芬

2 个答案:

答案 0 :(得分:17)

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

有几个可能的原因;

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

请注意; 在CakePHP中,在任何重定向语句之前放置return是一种很好的做法;这样可以更好地对您的应用进行单元测试,例如:

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

更新;找到原因的其他“指针”

跟踪这些问题可能很麻烦,我会添加一些指示

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

调试代码:

if (headers_sent($file, $line)) {
    exit("headers were already sent in file: {$file}, line number: {$line}");
}

答案 1 :(得分:5)

经过大量研究后,我得到了解决方案。

请使用

ob_start();

中的

AppController.php

ob_start();
class AppController extends Controller {
     function beforeFilter() {
         parent::beforeFilter();
     }
}