【问题标题】:Stop execution after render in beforeFilter of CakePHP在 CakePHP 的 beforeFilter 中渲染后停止执行
【发布时间】:2012-05-27 09:52:49
【问题描述】:

在我的 CakePHP 2 应用程序中,我遇到了 beforeFilter 的问题。 在this thread 中运行良好。因为是老版本的 CakePHP。

在我的代码中,如果用户未经授权,我想向他展示“anotherview.ctp”。 我不想将访问者重定向到另一个页面。 (因为 AdSense 问题)

当我在 beforeFilter 中使用“this->render”时,我的“index”操作中的代码也会运行。 我想在“beforeFilter”的最后一行之后停止执行。 当我将“exit()”添加到 beforeFilter 时,它破坏了我的代码。

如何在 beforeFilter 中停止执行而不破坏代码?

class MyController extends AppController {
    function beforeFilter() {
        if ( $authorization == false )  {
                $this->render('anotherview');
                //exit();
            }
        }
    }

    function index() {
        // show authorized staff
    }           
}

【问题讨论】:

    标签: cakephp cakephp-2.0 before-filter


    【解决方案1】:

    试试:

    $this->response->send();
    $this->_stop();
    

    【讨论】:

    • $this->render('anotherview'); 之前我应该​​写“$this->autoRender = false;”还是不要我需要这个吗?我不能确定它是否会改变任何东西。
    • 这只会在视图/操作方法运行后生效,但由于您在 beforeFilter 中停止它,所以它没有影响。
    • 顺便说一下,$this->_stop() 基本上是 die() / exit() 的包装器 - 从 Cake 2.2 开始,它没有做任何额外的事情。并且die() 打字更短。 :-)
    • @Simon 你不能在不破坏你的测试套件的情况下测试对 die()/exit() 的调用
    • 对于这个原始答案的有价值的补充,检查SDP's answer。 @tigrang 我很想编辑您的答案并添加对先前引用的答案的参考以进行改进,但我认为这是不公平的,所以我留给您编辑您的答案未来的读者。干杯!!
    【解决方案2】:

    我在尝试做同样的事情时偶然发现了这个线程。接受的答案有效,但省略了一个重要细节。我正在尝试渲染布局(不是视图),我必须添加额外的一行以防止原始请求的视图抛出错误。

    内部AppController::beforeFilter()

    $this->render(FALSE, 'maintenance'); //I needed to add this
    $this->response->send();
    $this->_stop();
    

    【讨论】:

    • 理想情况下,这应该是对原始解决方案的关键补充的公认答案(否则给用户一个空白页没有任何意义)但是因为原始解决方案是在 OP 问题时给出的已发布,将其保留为已接受的解决方案可能仍然是合理的。
    【解决方案3】:

    或者 - 重定向到另一个视图:

    if ( $authorization == false )  {
        $this->redirect('/users/not_authorized');
    }
    

    【讨论】:

      【解决方案4】:

      对于 CakePHP 3.5,这对我有用:

      $event->setResult($this->render('anotherview'));
      

      这也将使您能够使用调试器。当我使用 exit; 语句时,CakePHP 调试器停止工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-18
        • 1970-01-01
        • 2014-08-01
        • 2013-08-24
        • 2014-07-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多