Cakephp 3重定向控制器

时间:2015-07-11 21:03:56

标签: cakephp redirect cakephp-3.0

在我的CakePHP 3应用程序中,在控制器重定向后,我收到此错误:

Error: [LogicException] Controller action can only return an instance of Response
Request URL: /mycontroller/
Stack Trace:
#0 /var/www/vhosts/example.com/httpdocs/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(87): Cake\Routing\Dispatcher->_invoke(Object(App\Controller\SigninsController))
#1 /var/www/vhosts/example.com/httpdocs/webroot/index.php(37): Cake\Routing\Dispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response))
#2 {main}

关于CakePHP 2 controller documentation重定向是这样的:

$this->redirect('/orders/thanks');
$this->redirect('http://www.example.com');
return $this->redirect(
        array('controller' => 'orders', 'action' => 'confirm')
    );

但在CakePHP 3 documentation中似乎是这样的:

return $this->redirect('/orders/thanks');
return $this->redirect('http://www.example.com');
return $this->redirect(
            ['controller' => 'Orders', 'action' => 'thanks']
        );

当我在return之前添加$this->redirect字时,错误就会解决。这会产生问题吗?因为我在cakephp 3 migration guide中看不到返回重定向部分。迁移指南仅提及删除了第三个参数。

5 个答案:

答案 0 :(得分:3)

返回CakePHP 3应用程序用于您想要重定向到其他页面,或者我们可以说其他控制器的操作/方法,或者即使您想要重定向到您指定的第三方链接: -

return $this->redirect('/orders/thanks');
return $this->redirect('http://www.example.com');
return $this->redirect(['controller' => 'Orders', 'action' => 'thanks']);

如果你想在同一个控制器中重定向到其他方法,那么你可以保留返回并使用如下的setAction,但这里的URL将保持不变。

$this->setAction('thanks'); 

如果您使用以下代码,则返回是更好的方法,网址将重定向。

return $this->redirect(['action' => 'thanks']);

答案 1 :(得分:0)

查看this

  

Response提供了一个界面来包装常见的响应相关任务,例如:   发送重定向标题。

this

  

您应该从操作中返回响应实例以防止视图呈现,并让调度程序处理实际的重定向。

答案 2 :(得分:0)

如果您使用路线名称,请使用此 -

    $this->redirect(['_name' => 'view-details']);

您正在使用路线然后使用此 -

$this->redirect('/page/view-details');

最后一个选项就是这个

$this->redirect(['controller' => 'Pages', 'action' => 'view']);
----------------------------------------------------------------------

如果您在视图文件中使用路由名称,则使用 -

use Cake\Routing\Router;

echo Router::url(['_name' => 'view-details']);

echo Router::url(['controller' => 'Articles', 'action' => 'view', 'id' => 15]);

答案 3 :(得分:0)

在cakephp中,3.6转到特定视图/页面使用$ this-> render('filename');

如下所示

公共功能搜索()     {

    $this->render(); 
            $this->render('profile'); 
}

答案 4 :(得分:0)

您需要关闭自动渲染

因为cakephp默认情况下希望以重定向到CTP文件结尾

使用$this->autoRender = false 内部功能