【问题标题】:CakePHP - Call to a member function allow() on a non-object errorCakePHP - 在非对象错误上调用成员函数 allow()
【发布时间】:2012-02-06 14:58:02
【问题描述】:

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

【问题讨论】:

  • 您的 App Controller 在 app/ 目录中是否像在 Cake1.3 中一样?
  • @Dave 是的,它在 cake1.3 中
  • 而且你的 AppController 文件在 app/ 目录下,而不是 app/controllers 目录下,是吗?

标签: php cakephp cakephp-1.3


【解决方案1】:

1.解决方案:您需要做的就是在您的UsersController中添加这一行:

public $components = array('Auth');

或者

2.Soluton:在 UsersController:

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

class UsersController extends AppController {

}

然后在 AppController 中:

public $components = array('Auth');

【讨论】:

    【解决方案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::__construct 是否被调用,因为这是 1.3 中大部分类初始化逻辑所在的位置。

    【讨论】:

      【解决方案3】:

      这个错误听起来像是 Auth 组件的加载失败。您是否尝试过从 $components 数组中删除设置并查看错误是否仍然存在?

      【讨论】:

      • 这种猜测答案通常作为评论更好(就像我上面的)。如果事实证明是正确的,提问的人可以给你更多关于它为什么正确的细节,然后你可以把它放在一个答案中以被接受。这有助于避免问题被填满,以及人们因为已经有了答案而忽略了问题。
      • 公平点,谢谢你现在让我知道。虽然我必须承认我确实找到了评论链接但找不到它(我确实看到了“链接”和“编辑”),但我确信我以前见过那个按钮......
      • 你可能还没有能力以 1 的代表得分发表评论。(当我向你提到它时,我没有想到这一点)
      • @Joep 我如何加载 Auth-component
      • @AjayPatel:我建议让 $components 数组看起来像 array('Acl', Auth', 'Session') 然后检查您的错误是否仍然存在。 (排除您在此处指定的配置选项作为此错误的原因(这似乎不太可能,但仍然如此))
      猜你喜欢
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 2014-03-13
      相关资源
      最近更新 更多