蛋糕php AppController和继承

时间:2010-04-14 05:24:58

标签: php cakephp acl

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

}
?>

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');
    }
}
?>

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

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:5)

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

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

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

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

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

    Router::connect('/shared/*', array('controller' => 'pages', 'action' => 'display', 'home'));
    
  5. 希望能帮助别人!

答案 1 :(得分:4)

如果有人想知道为什么他们$components$helpers覆盖而不是在更改继承后合并是因为你需要定义protected $_mergeParent = 'YourParentClass';。默认情况下,它设置为“AppController”。

来源:CakePHP 2.4 Source Code

答案 2 :(得分:0)

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

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

编辑@deceze

您可以在/app/yourown_app_controller.php

中编写自己的自定义基本控制器
class YourOwnAppController extends Controller
{
       var $components = array("Auth");
}

然后通过子控制器文件中的require_once(APP."yourown_app_controller.php");等要求使用它。