CakePHP - 在非对象错误上调用成员函数allow()

时间:2012-01-10 06:01:42

标签: php cakephp cakephp-1.3

我正在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版

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)

此类错误有两个常见原因:

未加载App控制器文件

如果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数组中删除设置并查看错误是否仍然存在?