我正在CakePHP中创建一个登录身份验证应用程序 并获得此致命错误:在第5行的/var/www/cakephp1/app/Controller/users_controller.php中调用非对象的成员函数allow()
这是我的控制器代码 的 users_controller.php中
<?php
class UsersController extends AppController {
public function beforeFilter() {
parent::beforeFilter();
$this->Auth->allow('add');
}
public function add() {
if (!empty($this->data)) {
$this->User->create();
if ($this->User->save($this->data)) {
$this->Session->setFlash('User created!');
$this->redirect(array('action'=>'login'));
} else {
$this->Session->setFlash('Please correct the errors');
}
}
$this->set('groups', $this->User->Group->find('list'));
}
public function login() {
}
public function logout() {
$this->redirect($this->Auth->logout());
}
public function dashboard() {
$groupName = $this->User->Group->field('name',
array('Group.id'=>$this->Auth->user('group_id'))
);
$this->redirect(array('action'=>strtolower($groupName)));
}
public function user() {
}
public function administrator() {
}
public function manager() {
}
}
?>
app_controller.php
<?php
class AppController extends Controller {
public $components = array(
'Acl',
'Auth' => array(
'authorize' => 'actions',
'loginRedirect' => array(
'admin' => false,
'controller' => 'users',
'action' => 'dashboard'
)
),
'Session'
);
}
?>
查看 login.ctp
<?php
echo $this->Form->create(array('action'=>'login'));
echo $this->Form->inputs(array(
'legend' => 'Login',
'username',
'password',
'remember' => array('type' => 'checkbox', 'label' => 'Remember me')
));
echo $this->Form->end('Login');
?>
我正在使用CakePHP 1.3版
答案 0 :(得分:3)
1.解决方案:您需要做的就是在 UsersController 中添加此行:
public $components = array('Auth');
或者
2.Soluton:在 UsersController:
App::uses('AppController', 'Controller');
class UsersController extends AppController {
}
然后在 AppController :
中public $components = array('Auth');
答案 1 :(得分:2)
此类错误有两个常见原因:
如果AppController
类不存在 - Cake将使用从核心获取的回退 - 它只是一个空类。对于要发生的问题中的错误 - Auth
组件尚未加载,最可能的原因是文件app/app_controller.php
不存在或不同AppController
在查找之前加载了类文件。
这可以使用get_included_files确认,例如:
class UsersController extends AppController {
public function beforeFilter() {
if (!isset($$this->Auth)) {
debug(get_included_files());
die;
}
查找已加载哪个 app_controller.php
文件 - 如果不包含问题中的类的文件,那就是问题。
好孩子总是打电话给他们的父母:)
如果构造函数(或任何方法)被覆盖并且没有调用the parent function,那么例如components属性不会被正确合并/设置,或者组件类将不会被初始化。
如果正在加载正确的app_controller.php
文件,请关注控制器类中定义的方法,并检查它们是否正在调用parent :: methodname(对于用户控制器和应用程序控制器)。具体来说,验证是否正在调用Controller :: __构造,因为大多数类初始化逻辑都在1.3中。
答案 2 :(得分:0)
该错误听起来像加载Auth组件失败。您是否尝试从$ components数组中删除设置并查看错误是否仍然存在?