0

我正在写一个小项目,一个非注册用户只能访问几个页面的页面,其他几个页面的注册页面,以及其他一些注册用户的页面。这是一场比赛,所以只有那些玩“比赛”的人才能接触到后者。此外,我们还会有一些页面,即管理员(秘密页面)。这是结构:

$Public_Path = '/public_html/public/';
$Private_Path = '/public_html/private/';
$Secret_Path = '/public_html/secret/';

我通过 /public_html/index.php 传递所有内容并从那里包含文件。我认为将所有包含和重定向放在一个地方而不是分散在每个文件的开头会更好。问题是,这里的代码开始变得混乱,还有更多的选项要添加。有没有简化它的模式?这就是我的代码现在的样子:

// Some extra code goes here

// If an unregistered user tries to go anywhere he shouldn't
if (!file_exists($Public_Path . $Url . '/index.php') && empty($User))
  header ('Location: /login/');

// PUBLIC. Load the public pages
if (file_exists($Public_Path . $Url . '/index.php'))
  include $Public_Path . $Url . '/index.php';

// SECRET. Only for admin
else if (file_exists($Secret_Path . $Url . '/index.php') && in_array($User->email, $Admins))
  include $Secret_Path . $Url . '/index.php';

// PRIVATE. Load the template and include private pages
else if (file_exists($Private_Path . $Url . '/index.php'))
  {
  if ($UrlArray[0] != 'games' && $User->game == 0)
    header ('Location: /games/');

  if ($UrlArray[1] == 'save')
    include $Private_Path . $Url . '/index.php';
  else
    {
    $Page = $Private_Path . $Url . '/index.php';
    include $Include_Path . 'template.php';
    }
  }

// 404. Nor public nor private nor secret
else
  header ('Location: /error/404');

注意:我知道只能index.php用这个访问的限制,我自己强加的。

我的问题是,我怎样才能以某种方式订购此代码,以允许我添加更多功能但仅增加一点复杂性?如何减少后者?

4

1 回答 1

1

我会考虑几个选择:

添加一个会话变量(比如,$_SESSION['userPath']),当用户登录时,将他们带到他们的授权路径:

$path = (isset($_SESSION['userPath']))?$_SESSION['userPath']:FALSE;

if($path){
  include $path . $Url . '/index.php';
} else {
  header ('Location: /login/');
}

您的格式适用于扩展,但如果您将其更改为 switch 语句,它可能在语义上更易于阅读。这将要求您将其归结为上面提到的一个变量(例如$_SESSION['userPath'])变量。

switch ($path){
  case "Public_Path":
    header ('Location: /login/');
    break;
  case "Private_Path":
     if ($UrlArray[0] != 'games' && $User->game == 0){
      header ('Location: /games/');
     }
     if ($UrlArray[1] == 'save'){
      include $Private_Path . $Url . '/index.php';
     } else {
      $Page = $Private_Path . $Url . '/index.php';
      include $Include_Path . 'template.php';
     }
    break;
  case "Secret_Path":
    if (in_array($User->email, $Admins){
      include $path . $Url . '/index.php';
    }
    break;
  case "New_Path":
    include $path . $Url . '/index.php';
    break;

   // ...

  case default:
    header ('Location: /error/404');
}

最后,如果您使用 AJAX 解决方案,而不是重定向,页面将重新加载到查看器的适当位置。在这种情况下,根本不需要重定向,而是在需要时加载所需的元素。

于 2013-04-17T18:59:10.853 回答