开发者

cake php AppController and inheritance

In many tutorial of Acl component in cakephp i got instruction that add component either in AppController or in all the other controllers which inherits AppController.......

but problem is

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

when i use the above line in AppConroller i cant use the Auth or Acl component... but when i use the same code in all the child classes it works fine........

what will be the problem

here is my 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';
}

}
?>

code for 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('co开发者_JAVA技巧ntroller' => 'homes', 'action' => 'index');
    }
}
?>

when i comment the line 4 this will b error on uncomment it works fine thanks in advance

any help will be appreciated.


I managed to pull this off. I had a pair of controllers that shared some methods, but other controllers in the application did not (and could not) use those methods because certain data had to be present in the model. Moreover, the controller containing the shared methods should not be allowed to be called in the URL, which was an extra challenge.

  1. Create a controller in your controllers folder called shared_controller.php. Define some shared methods in it, and make sure it extends AppController:

    class SharedController extends AppController {
    
  2. My subcontrollers were extending AppController. Change this to extend SharedController instead. I couldn't get the shared controller to autoload, so I added an App::import above that:

    App::import('Controller', 'Shared');
    class SubController extends SharedController {
    
  3. Components and helpers must be merged into their parent variables manually; otherwise the child classes will overwrite them. Define a __construct method in each subcontroller and call array_merge on the components, helpers, and whatever else. Call the parent constructor at the end. Note: this cannot be done in beforeFilter

    function __construct(){
        $this->components = array_merge($this->components,array('Mycomponent'));
        parent::__construct();
    }
    
  4. If you call http://example.com/shared/method, you'll probably get an error that you're missing a database table, or missing a view. I didn't need any methods from Shared to be called directly, so I defined a route to just redirect to the homepage:

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

Hope that helps someone!


If anyone is wondering why their $components and $helpers overwrite instead of merging after changing inheritance is because you need to define protected $_mergeParent = 'YourParentClass';. By default this is set to 'AppController'.

Source: CakePHP 2.4 Source Code


I think there may be something wrong in your code.If you add the line in /app/cake/libs/controller/app_controller.php,every child class should be able to use the components.See about app_controller in cookbook:

CakePHP merges the following variables from the AppController to your application's controllers:$components,$helpers,$uses

EDit @deceze

you may write your own customized base controller in /app/yourown_app_controller.php

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

then use it by a requirment like require_once(APP."yourown_app_controller.php"); in the child contrller file.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜