蛋糕php AppController和继承

蛋糕php AppController和继承,php,cakephp,acl,Php,Cakephp,Acl,在许多关于cakephp中Acl组件的教程中 我得到了在AppController或继承AppController的所有其他控制器中添加组件的指令 但问题是 var $components=array('Auth',Acl); 当我在AppConroller中使用上述行时,我无法使用Auth或Acl组件。。。 但是,当我在所有子类中使用相同的代码时,它工作得很好 有什么问题吗 这是我的appController <?php class AppController extends Cont

在许多关于cakephp中Acl组件的教程中 我得到了在AppController或继承AppController的所有其他控制器中添加组件的指令

但问题是

var $components=array('Auth',Acl);
当我在AppConroller中使用上述行时,我无法使用Auth或Acl组件。。。 但是,当我在所有子类中使用相同的代码时,它工作得很好

有什么问题吗

这是我的appController

<?php
class AppController extends Controller {

     var $helpers = array('Html', 'Form', 'Session','CssMenu');
     var $components = array('Auth');

     function beforeFilter() {
        //Configure AuthComponent
        $this->Auth->authorize = 'actions';
        $this->Auth->authError = "Sorry, you are lacking access.";
        $this->Auth->userModel = 'Login';
}

}
?>
<?php
class userssController extends AppController{
    var $name="Logins";
    //var $components = array('Auth');
    var $layout='login';

    function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow('*');
        $this->Auth->loginRedirect = array('controller' => 'homes', 'action' => 'index');
    }
}
?>

usersController的代码

<?php
class AppController extends Controller {

     var $helpers = array('Html', 'Form', 'Session','CssMenu');
     var $components = array('Auth');

     function beforeFilter() {
        //Configure AuthComponent
        $this->Auth->authorize = 'actions';
        $this->Auth->authError = "Sorry, you are lacking access.";
        $this->Auth->userModel = 'Login';
}

}
?>
<?php
class userssController extends AppController{
    var $name="Logins";
    //var $components = array('Auth');
    var $layout='login';

    function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow('*');
        $this->Auth->loginRedirect = array('controller' => 'homes', 'action' => 'index');
    }
}
?>

当我注释第4行时,这将导致b错误 在取消注释时,它可以正常工作 提前谢谢


任何帮助都将不胜感激。

我认为您的代码中可能有错误。如果您在
/app/cake/libs/controller/app_controller.php
中添加该行,则每个子类都应该能够使用这些组件。请参阅:

CakePHP将以下变量从AppController合并到应用程序的控制器:
$components、$helpers、$uses

编辑@deceze

您可以在
/app/yourown\u app\u controller.php

class YourOwnAppController extends Controller
{
       var $components = array("Auth");
}

然后按要求使用它,比如
require\u once(APP.“yourown\u APP\u controller.php”)在子控件文件中。

我成功地实现了这一点。我有一对共享某些方法的控制器,但应用程序中的其他控制器没有(也不能)使用这些方法,因为某些数据必须存在于模型中。此外,不应允许在URL中调用包含共享方法的控制器,这是一个额外的挑战

  • 在控制器文件夹中创建名为shared_controller.php的控制器。在其中定义一些共享方法,并确保它扩展AppController:

    class SharedController extends AppController {
    
  • 我的分包商正在扩展AppController。改为扩展SharedController。我无法使共享控制器自动加载,因此我在上面添加了一个App::import:

    App::import('Controller', 'Shared');
    class SubController extends SharedController {
    
  • 组件和助手必须手动合并到其父变量中;否则子类将覆盖它们。在每个子滚轴中定义一个_构造方法,并在组件、助手和其他任何对象上调用array_merge。最后调用父构造函数。注意:这不能在beforeFilter中完成

    function __construct(){
        $this->components = array_merge($this->components,array('Mycomponent'));
        parent::__construct();
    }
    
  • 如果调用,可能会出现一个错误,即缺少数据库表或视图。我不需要直接调用Shared中的任何方法,因此我定义了一个重定向到主页的路径:

    Router::connect('/shared/*', array('controller' => 'pages', 'action' => 'display', 'home'));
    

  • 希望这对别人有帮助

    如果有人想知道为什么他们的
    $components
    $helpers
    在更改继承后覆盖而不是合并,是因为您需要定义
    受保护的$\u mergeParent='yourpentclass'。默认情况下,此设置为“AppController”


    资料来源:

    +1用于一般共识,即如果放入AppController中,它应该可用,-1用于建议编辑
    /cake/libs/*
    。除非有bug需要修复,否则切勿触摸
    /cake
    目录。您可以而且应该将
    app\u controller.php
    放在您的
    /app
    目录中!很抱歉,您的编辑也是错误的。在
    /app
    目录中名为
    app\u controller.php
    的文件中创建一个名为
    AppController
    的类。这是应该做的,Cake明确地支持这种方式@deceze,在这一点上我恐怕不能同意你的看法。没有必要让定制的
    appcontroller
    始终作为
    app\u controller.php
    ,因为人们可能并不总是只需要一种基本控制器来扩展。好的,从技术上讲,你可以定制基本控制器,没错。然而,放弃传统是不好的,尤其是在毫无收获的情况下。如果您需要两个不同的基本控制器(…?),您可以使用此方法,但这与此问题无关。@deceze,在我上一个招聘项目中,我们为不同的角色使用了一些基本控制器,如求职者、管理员、公司用户等,我认为这比只扩展一个
    appcontroller
    :)要好,你用的是什么版本的蛋糕?