Cakephp AuthComponent在某些控制器中不可用?

Cakephp AuthComponent在某些控制器中不可用?,cakephp,cakephp-2.0,Cakephp,Cakephp 2.0,我已经编写了我的cake应用程序来登录注册用户,它在具有与用户相关联的db模型的查看页面上非常有效。但是,在我的主页上,不一定要访问某个模型(PagesController,其中的页面是即将到来的事件、联系我们、关于等),AuthComponent不可用,或者至少数组返回空的——因此我无法检索(比如)登录者的用户名 我尝试创建一个名为Page的模型,它属于用户,但并没有解决我的问题 为了进一步解释,我的应用程序显示了特定城市的特定住宿、夜总会、餐馆和要做的事情的列表,所有这些都显示了用户是否登录

我已经编写了我的cake应用程序来登录注册用户,它在具有与用户相关联的db模型的查看页面上非常有效。但是,在我的主页上,不一定要访问某个模型(PagesController,其中的页面是即将到来的事件、联系我们、关于等),AuthComponent不可用,或者至少数组返回空的——因此我无法检索(比如)登录者的用户名

我尝试创建一个名为Page的模型,它属于用户,但并没有解决我的问题

为了进一步解释,我的应用程序显示了特定城市的特定住宿、夜总会、餐馆和要做的事情的列表,所有这些都显示了用户是否登录。我不明白我错在哪里,为什么

这是我的AppController:

<?php
class AppController extends Controller {
 public $components = array(
    'Session',
    'Auth' => array(
        'loginRedirect' => array('controller' => 'users', 'action' => 'view'),
        'logoutRedirect' => array('controller' => 'pages', 'action' => 'index')
    )
);


function beforeFilter() {
    $this->Auth->allow('login', 'logout','index', 'view', 'condos', 'houses', 'hotels_and_motels', 'print_all_coupons', 'print_coupon', 'search', 'golf', 'charters', 'events', 'nightlife', 'shopping', 'visitors_info', 'contact_us');

}
}
?>

以下是我在默认页面布局中访问用户名的位置:

<?php if(AuthComponent::user('id')) {
        echo '<span style="font-variant:small-caps">Hello, '.AuthComponent::user('username').'</span> | ';
?>

在没有看到任何代码的情况下,我的第一反应是,您不是在AppController中加载组件,而是仅在UsersController中加载组件。是否正在AppController中加载身份验证组件

更新:

下面是我建议访问用户信息的方式

$this->Session->read('Auth.User.username');
更新2

从页面控制器中删除
$components
声明。它可能正在覆盖会话

更新3


如果您有一个自定义页面控制器,它可能与核心页面控制器冲突。卸下Pages控制器,看看它是否正常工作。Core Pages controller仍将路由到
Views/Pages/
目录以显示内容。

在没有看到任何代码的情况下,我的第一反应是,您没有在AppController中加载组件,而只是在UsersController中加载组件。是否正在AppController中加载身份验证组件

更新:

下面是我建议访问用户信息的方式

$this->Session->read('Auth.User.username');
更新2

从页面控制器中删除
$components
声明。它可能正在覆盖会话

更新3



如果您有一个自定义页面控制器,它可能与核心页面控制器冲突。卸下Pages控制器,看看它是否正常工作。Core Pages controller仍将路由到
Views/Pages/
目录以显示内容。

我已经找到了答案,在数周的时间里,我一直在为这个问题绞尽脑汁。哦,你会笑的。对于任何遇到这个问题的人来说,答案是……确保标签前后没有空格。仅此而已。认真地由于PHP打印出PHP标记中没有的所有内容,如果它找到要发送的内容,它将首先发送标题。一旦发送了头,就无法创建PHP会话。所以把这个记在拍头档案上

我已经找到了答案,几个星期以来,我一直在为这个问题绞尽脑汁。哦,你会笑的。对于任何遇到这个问题的人来说,答案是……确保标签前后没有空格。仅此而已。认真地由于PHP打印出PHP标记中没有的所有内容,如果它找到要发送的内容,它将首先发送标题。一旦发送了头,就无法创建PHP会话。所以把这个记在拍头档案上

您可能需要提供更多的代码来帮助我们了解代码库正在做什么。在视图中使用组件是一种不好的做法,会破坏MVC中的层分离。例如,我会在beforeRender中将$this->set(“userId”)设置为所有视图中的$userId。这对性能也有好处,因为您只访问了一次会话,并重新使用变量中的值。但你不认为这是没有意义的,因为用户id在这些页面上不可用(无论出于什么原因,我们无法弄清楚)。你可能需要提供更多的代码来帮助我们了解代码库正在做什么。在视图中使用组件是一种不好的做法,破坏了MVC中的层分离。例如,我会在beforeRender中将$this->set(“userId”)设置为所有视图中的$userId。这对性能也有好处,因为您只访问了一次会话,并重新使用变量中的值。但你不认为这是没有意义的,因为用户id在这些页面上不可用(无论出于什么原因,我们无法弄清楚),我想我添加它是正确的。请参阅OP,我已经展示了我的AppController代码。您如何访问应用程序中使用的用户名?我尝试将其添加到PagesController的index()方法中,但它在索引页上不起作用(以前不起作用的一个点)。我甚至试着在页面布局中用它代替AuthComponent::user('username')。将会话数据的调试打印到屏幕
pr($this->session->read('Auth.user'))
这样您就可以看到会话中存储的内容。调试将在PagesController以外的所有页面上打印,其他页面则不打印任何内容。我想,在这个控制器中,它看不到会话,并且我有public$components=array('Auth','Acl','session'));在PagesController的类声明中。我认为我添加的是正确的。请参阅OP,因为我已经显示了我的AppController代码。您如何访问用户的名称以在应用程序中使用?我尝试将其添加到PagesController的index()方法中,但在index页上不起作用(这是它以前不起作用的地方之一)。我甚至试着在页面布局中用它代替AuthComponent::user('username')。将会话数据的调试打印到屏幕
pr($this->session->read('Auth.user');
以便查看存储在