【问题标题】:cake php AppController and inheritancecake php AppController 和继承
【发布时间】:2011-02-07 18:28:05
【问题描述】:

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

但问题是

var $components=array('Auth',Acl);

当我在 AppConroller 中使用上述行时,我无法使用 Auth 或 Acl 组件... 但是当我在所有子类中使用相同的代码时,它工作正常............

会有什么问题

这是我的应用控制器

<?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 行时,这将是错误 取消评论它工作正常 提前致谢

我们将不胜感激。

【问题讨论】:

  • 你用的是什么版本的 Cake?

标签: php cakephp acl


【解决方案1】:

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

  1. 在您的控制器文件夹中创建一个名为 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'));
    

希望对某人有所帮助!

【讨论】:

    【解决方案2】:

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

    来源:CakePHP 2.4 Source Code

    【讨论】:

      【解决方案3】:

      我认为您的代码可能有问题。如果您在/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"); 之类的要求使用它。

      【讨论】:

      • +1 表示如果放入 AppController 应该可用,-1 表示建议编辑 /cake/libs/*。除非有要修复的错误,否则切勿触摸/cake 目录。您可以而且应该将app_controller.php 放在您的/app 目录中!
      • 对不起,您的编辑也是错误的。您在/app 目录中名为app_controller.php 的文件中创建了一个名为AppController 的类。这就是它应该完成的方式,Cake 明确支持这种方式。 book.cakephp.org/view/829/The-App-Controller
      • @deceze,恐怕我不能同意你的观点。没有必要将appcontroller总是自定义为app_controller.php,因为人们可能并不总是只需要一种基础控制器扩展。
      • 好的,从技术上讲,您可以制作自定义基本控制器,没错。放弃约定是不好的,尤其是没有收获。如果您需要两个不同的基本控制器(...?),您可以使用此方法,但这与此问题无关。
      • @deceze,在我上一个招聘项目中,我们为不同的角色使用了一些基本控制器,例如求职者、管理员、公司用户..等等,我认为这比仅仅扩展一个 appcontroller 更好。: )
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      • 2014-10-04
      • 1970-01-01
      • 2013-08-14
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多