2

我正在使用 CakePHP 2.8.3 并试图在我的控制器中使用这个组件,但我收到了这个错误,是否有人遇到过同样的情况,请帮忙。

致命错误错误:在非对象上调用成员函数 header() 文件:/mnt/hgfs/Projects/dev_kp/lib/Cake/Controller/Controller.php
行:779 注意:如果要自定义此错误消息, 创造

应用程序/视图/错误/fatal_error.ctp

//Controller
    <?php

    App::uses('AppController', 'Controller');

    class UsersController extends AppController
    {
        public $name = 'Users';
        public $components = array('UserAuth');
        public $uses = array('User');

        public function dashboard()
        {
            echo $this->UserAuth->ValidateUser();
        }
    }
    ?>

    //Component
    <?php

    App::uses('Component', 'Controller');

    class UserAuthComponent extends Component
    {

        public function ValidateUser()
        {
           if(isset($_SESSION["USER_VALIDATE"]))
           {
              if($_SESSION["USER_VALIDATE"] == TRUE)
                 return TRUE;
           }
           else
           {
              $direct = new AppController();
              $direct->redirect(array('controller' => 'users', 'action' => 'login'));
            }
         }
     }
    ?>
4

1 回答 1

1

第一件事

CakePHP 带有一个身份验证层,几乎不需要实现您自己的。如果您需要自定义身份验证,那么您应该使用自定义身份验证对象来实现它,请参阅

话虽如此

您所做的不是 CakePHP 的工作方式,您不手动实例化控制器,也不$_SESSION直接访问超全局变量,而是使用 CakePHP 提供的抽象接口。

在将代码放在一起之前,请阅读文档并确保您了解正在使用的 API。

如您所见,组件确实会收到在每个回调中使用它们的控制器的引用,因此如果您需要访问控制器功能,则使用该引用。如果您以后需要使用它,请将其存储在一个属性中,例如

protected $_controller = null;

public function initialize(Controller $controller) {
    $this->_controller = $controller;
}

public function ValidateUser() {
    // ...
    $this->_controller->redirect(/* ... */);
}

可以通过可以包含在自定义组件中的会话组件轻松访问会话,例如

public $components = array('Session');

public function ValidateUser() {
    // ...
    $value = $this->Session->read('USER_VALIDATE');
}
于 2016-04-08T15:33:14.203 回答