无法在控制器中包含和使用组件的方法
Not able to include and use component's method in controller
我正在使用 CakePHP 2.8.3 并尝试将此组件用于我的控制器,但出现此错误,请问有没有人遇到过同样的情况,请帮忙。
Fatal Error Error: Call to a member function header() on a non-object
File: /mnt/hgfs/Projects/dev_kp/lib/Cake/Controller/Controller.php
Line: 779 Notice: If you want to customize this error message, create
app/View/Errors/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'));
}
}
}
?>
要事第一
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');
}
我正在使用 CakePHP 2.8.3 并尝试将此组件用于我的控制器,但出现此错误,请问有没有人遇到过同样的情况,请帮忙。
Fatal Error Error: Call to a member function header() on a non-object File: /mnt/hgfs/Projects/dev_kp/lib/Cake/Controller/Controller.php
Line: 779 Notice: If you want to customize this error message, createapp/View/Errors/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'));
}
}
}
?>
要事第一
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');
}