蛋糕php AppController和继承

RSK*_*RSK 2 php acl cakephp

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

但问题是

var $components=array('Auth',Acl);
Run Code Online (Sandbox Code Playgroud)

当我在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';
}

}
?>
Run Code Online (Sandbox Code Playgroud)

usersController的代码

<?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');
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

当我评论第4行时,这将是取消注释的错误,它提前工作正常

任何帮助将不胜感激.

ell*_*iot 5

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

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

    class SharedController extends AppController {
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我的子控制器正在扩展AppController.更改此选项以扩展SharedController.我无法让共享控制器自动加载,所以我在上面添加了一个App :: import:

    App::import('Controller', 'Shared');
    class SubController extends SharedController {
    
    Run Code Online (Sandbox Code Playgroud)
  3. 必须手动将组件和帮助程序合并到其父变量中; 否则子类将覆盖它们.在每个子控制器中定义__construct方法,并在组件,帮助程序和其他任何内容上调用array_merge.最后调用父构造函数.注意:这不能在beforeFilter中完成

    function __construct(){
        $this->components = array_merge($this->components,array('Mycomponent'));
        parent::__construct();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 如果您调用http://example.com/shared/method,则可能会收到错误,指出您缺少数据库表或缺少视图.我不需要从Shared直接调用任何方法,所以我定义了一个只重定向到主页的路由:

    Router::connect('/shared/*', array('controller' => 'pages', 'action' => 'display', 'home'));
    
    Run Code Online (Sandbox Code Playgroud)

希望有人帮助!