在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行时,这将是错误的 取消注释它工作正常 提前谢谢
任何帮助将不胜感激。
答案 0 :(得分:5)
我设法把它拉了下来。我有一对控制器共享一些方法,但应用程序中的其他控制器没有(也不能)使用这些方法,因为某些数据必须存在于模型中。此外,不应允许在URL中调用包含共享方法的控制器,这是一个额外的挑战。
在controllers文件夹中创建一个名为shared_controller.php的控制器。在其中定义一些共享方法,并确保它扩展AppController:
class SharedController extends AppController {
我的子控制器正在扩展AppController。更改此选项以扩展SharedController。我无法让共享控制器自动加载,所以我在上面添加了一个App :: import:
App::import('Controller', 'Shared');
class SubController extends SharedController {
必须手动将组件和帮助器合并到其父变量中;否则子类将覆盖它们。在每个子控制器中定义__construct方法,并在组件,帮助程序和其他任何内容上调用array_merge。最后调用父构造函数。注意:这不能在beforeFilter
中完成function __construct(){
$this->components = array_merge($this->components,array('Mycomponent'));
parent::__construct();
}
如果您致电http://example.com/shared/method,您可能会收到错误消息,表示您错过了数据库表或缺少视图。我不需要从Shared直接调用任何方法,所以我定义了一个只重定向到主页的路由:
Router::connect('/shared/*', array('controller' => 'pages', 'action' => 'display', 'home'));
希望能帮助别人!
答案 1 :(得分:4)
如果有人想知道为什么他们$components
和$helpers
覆盖而不是在更改继承后合并是因为你需要定义protected $_mergeParent = 'YourParentClass';
。默认情况下,它设置为“AppController”。
答案 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");
等要求使用它。