如何在布局中访问登录的用户数据。 (CakePHP 3)

How to access logged in user data, in a layout. (CakePHP 3)

我有一个用 cakephp 3 编写的网络应用程序。

我想要一个显示登录用户名字和姓氏的布局。就像 facebook 主页上的东西。您可以单击并转到您的页面。 我想在每个页面都有这个功能,所以我决定使用布局。

我的 Users table 就像:

| id | 用户名 | 密码 | 电子邮件 | first_name | last_name | 已创建 | 已修改 |

我这样使用身份验证组件:

$this->loadComponent('Auth', [
        'loginRedirect' => [
            'controller' => 'Pages',
            'action' => 'display'
        ],
        'logoutRedirect' => [
            'controller' => 'Users',
            'action' => 'login'
        ],
        'authError' => 'Authentication Error'
    ]);

如何在布局中加载用户的名字和姓氏?

您可以使用 Session 来完成。喜欢:

$user = "";
$loguser = $this->Session->read('Auth.User');
if(!empty($loguser)){
    $user = $loguser['first_name']." ".$loguser['last_name'];
}

更新(2015 年 8 月 23 日):

最近 cakephp 表示 SessionHelper 已弃用,您应该改用 request->session()

$loguser = $this->request->session()->read('Auth.User');
if(!$loguser) {
    $user = $loguser['first_name'].' '.$loguser['last_name'];
}

您可以通过控制器将变量传递给视图:

$this->set('user','users_data');

然后将其传递给布局:

$this->assign('user',$user);

并通过以下方式在布局中显示它:

$this->fetch('user');

您需要将数据从控制器传递到视图环境。 我发现在全球范围内执行此操作的最佳方法是将 set() 语句放在 AppController::beforeRender-

   // make logged in user's first name available to the view (mainly for menu)
  $name="(none)";
  if($this->Auth->user()) {
    $name = $this->Auth->user("first_name");
  }

  $this->set("user_first_name", $name);

请确保不要将任何敏感数据放在那里,例如密码,因为模板级别的错误可能会暴露它。