蛋糕php AppController和继承
在许多关于cakephp中Acl组件的教程中 我得到了在AppController或继承AppController的所有其他控制器中添加组件的指令 但问题是蛋糕php AppController和继承,php,cakephp,acl,Php,Cakephp,Acl,在许多关于cakephp中Acl组件的教程中 我得到了在AppController或继承AppController的所有其他控制器中添加组件的指令 但问题是 var $components=array('Auth',Acl); 当我在AppConroller中使用上述行时,我无法使用Auth或Acl组件。。。 但是,当我在所有子类中使用相同的代码时,它工作得很好 有什么问题吗 这是我的appController <?php class AppController extends Cont
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';
}
}
?>
<?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');
}
}
?>
usersController的代码
<?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';
}
}
?>
<?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行时,这将导致b错误
在取消注释时,它可以正常工作
提前谢谢
任何帮助都将不胜感激。我认为您的代码中可能有错误。如果您在
/app/cake/libs/controller/app_controller.php
中添加该行,则每个子类都应该能够使用这些组件。请参阅:
CakePHP将以下变量从AppController合并到应用程序的控制器:$components、$helpers、$uses
编辑@deceze
您可以在/app/yourown\u app\u controller.php
class YourOwnAppController extends Controller
{
var $components = array("Auth");
}
然后按要求使用它,比如
require\u once(APP.“yourown\u APP\u controller.php”)代码>在子控件文件中。我成功地实现了这一点。我有一对共享某些方法的控制器,但应用程序中的其他控制器没有(也不能)使用这些方法,因为某些数据必须存在于模型中。此外,不应允许在URL中调用包含共享方法的控制器,这是一个额外的挑战
在控制器文件夹中创建名为shared_controller.php的控制器。在其中定义一些共享方法,并确保它扩展AppController:
class SharedController extends AppController {
我的分包商正在扩展AppController。改为扩展SharedController。我无法使共享控制器自动加载,因此我在上面添加了一个App::import:
App::import('Controller', 'Shared');
class SubController extends SharedController {
组件和助手必须手动合并到其父变量中;否则子类将覆盖它们。在每个子滚轴中定义一个_构造方法,并在组件、助手和其他任何对象上调用array_merge。最后调用父构造函数。注意:这不能在beforeFilter中完成
function __construct(){
$this->components = array_merge($this->components,array('Mycomponent'));
parent::__construct();
}
如果调用,可能会出现一个错误,即缺少数据库表或视图。我不需要直接调用Shared中的任何方法,因此我定义了一个重定向到主页的路径:
Router::connect('/shared/*', array('controller' => 'pages', 'action' => 'display', 'home'));
希望这对别人有帮助 如果有人想知道为什么他们的$components
和$helpers
在更改继承后覆盖而不是合并,是因为您需要定义受保护的$\u mergeParent='yourpentclass'代码>。默认情况下,此设置为“AppController”
资料来源:+1用于一般共识,即如果放入AppController中,它应该可用,-1用于建议编辑/cake/libs/*
。除非有bug需要修复,否则切勿触摸/cake
目录。您可以而且应该将app\u controller.php
放在您的/app
目录中!很抱歉,您的编辑也是错误的。在/app
目录中名为app\u controller.php
的文件中创建一个名为AppController
的类。这是应该做的,Cake明确地支持这种方式@deceze,在这一点上我恐怕不能同意你的看法。没有必要让定制的appcontroller
始终作为app\u controller.php
,因为人们可能并不总是只需要一种基本控制器来扩展。好的,从技术上讲,你可以定制基本控制器,没错。然而,放弃传统是不好的,尤其是在毫无收获的情况下。如果您需要两个不同的基本控制器(…?),您可以使用此方法,但这与此问题无关。@deceze,在我上一个招聘项目中,我们为不同的角色使用了一些基本控制器,如求职者、管理员、公司用户等,我认为这比只扩展一个appcontroller
:)要好,你用的是什么版本的蛋糕?