存储不同用户级别的页面路由和导航的最佳方法


Best approach to store page routing and navigation for different userlevels

我正在重写一个旧的php框架。目前,导航、路由和授权是根据每个页面请求上加载的配置文件完成的。

我已经将配置文件更改为数据库。根据用户级别和授权,每个用户加载的页数不同。但对于每个页面请求,仍会执行多个数据库查询,加载所有条目,并处理导航、路由和授权。我想这可以"缓存",因为大多数时候,这些函数的结果对于特定用户是相同的。

什么是最好的方法?

将函数的结果缓存在对象中并存储在会话中?是否为每个用户生成带有对象的临时文件?用memcached将它们存储在内存中?还是保持这种方式并对每个页面请求进行处理?

编辑:该框架是面向对象的,并且已经在会话对象中缓存了用户名/用户级别之类的内容。

不知道你的框架是如何工作的,无论它是一堆函数还是有点面向对象的,所以不容易给你指明确切的方向,但这里有一种方法可以避免执行重复的查询,这些查询总是在一个请求中返回相同的数据。

假设你的应用程序中有几个地方需要记录用户的信息,为了简单起见,我假设你的用户是对象,身份验证也使用类执行:)

class Auth
{
  private static $logged_user = false;
  static function getLoggedUser()
  {
    if (self::$logged_user === false) {
      self::$logged_user = do_some_magic_();
    }
    return self::$logged_user;
  }
}

在上面的例子中,调用Auth::getLoggedUser()将检查私有属性$logged_user是否是默认的false,如果是,则它将执行身份验证(例如,使用会话中的数据或其他什么),将其存储在该私有类属性中,并且对Auth::getLoggedUser()的每一个连续调用都将简单地返回已经获取的用户对象。您也可以在登录时设置logged_user

以类似的方式,您可以"缓存"复杂操作的各种其他结果,并节省时间/内存/查询。但是,请注意,如果生成的对象在应用程序的请求过程中确实发生了更改,则这可能会产生不希望的结果,因此请注意:)