0

我使用以下作为 Frontpage/Page Controller(s),到目前为止它工作正常,除了我面临的两个问题,如你所见,$pages 数组和开关实际上比我的那个长得多'已经粘贴在这里。每次需要新的页面控制器时,我都必须将其添加到 $pages 数组并进行切换,这会使该列表非常长。您将如何克服这个问题,您是否看到此代码有任何其他改进?loadLogic()在页面控制器中,它用于获取 pages/controllername/logic/function.php 下的函数。

Frontpage 控制器 - index.php:

include 'common/common.php';
if(!isset($_GET['p']) OR $_GET['p'] == ''){
    $_GET['p'] = 'home';
    header('Location: index.php?p=home');
}

$pages = array('home','register','login','logout','page1','page2','page3');

$_GET['p'] = trim($_GET['p']);

if(isset($_GET['p'])){
    if(in_array($_GET['p'], $pages)){
        switch ($_GET['p']) {
            case 'home':
                include 'home.php';
                break;
            case 'register':
                include 'register.php';
                break;
            case 'login':
                include 'login.php';
                break;
            case 'logout':
                include 'logout.php';
                break;
            case 'page1':
                include 'page1.php';
                break;
            case 'page2':
                include 'page2.php';
                break;
            case 'page3':
                include 'page3.php';
                break;
        }
    }else{
        echo '404!';
    }
}

页面控制器 - {home,register,login,logout,page1,page2,page3}.php:

include 'tpl/common/header.php';
contentStart();

if(isset($_SESSION['logged'])){
    loadLogic('dashboard');

}else{
    loadLogic('nologin');

}


//Display login form in logic page instead links
//
if(!isset($_SESSION['logged'])){
    contentEnd();
    loadLogic('nologinForm');
}else{
  contentEnd();
  include'tpl/common/rcol.php';

}
include 'tpl/common/footer.php';

函数加载逻辑():

function loadLogic($logic) {
    $path = dirname(__DIR__) . '/pages';

    $controller = preg_split('/&/',$_SERVER['QUERY_STRING']);
    $controller = trim($controller[0],"p=");
    $logicPath = 'logic';
    $logic = $logic . '.php';
    $err = 0;
    $logicFullPath = $path.'/'.$controller.'/'.$logicPath.'/'.$logic;

    if($err == '0'){
        include "$logicFullPath";

    }
}

文件夹结构:

projectName
  |
   ---> common
  |
   ---> pages
  |   |
  |    --->home
  |   |
  |    --->register
  |   |
  |    --->login
  |   |
  |    --->logout
  |   |
  |    --->page1
  |   |
  |    --->page2
  |   |
  |    --->page3
  |
   ---> tpl
  |   |
  |    ---> common
  |
   --> home.php
  |
   --> register.php
  |
   --> login.php
  |
   --> logout.php
  |
   --> page1.php
  |
   --> page2.php
  |
   --> page3.php
4

1 回答 1

2

对于frontpage控制器,为什么有这么多case语句。您已经知道可以包含哪些页面,并检查它是否在有效页面中。

你可以这样做:

if(isset($_GET['p']))
{
    if(in_array($_GET['p'], $pages))
    {
         include($_GET['p'] . '.php');
    }
}

如果您希望它具有不同的名称传递给 $_GET 进行混淆,以及不同的潜在扩展,那么您可以这样做:

$pages = array('home'=>'index.php','register'=>'registerpage.htm','page1'=>'one.html');

if(isset($_GET['p']))
{
    if(array_key_exists($_GET['p'],$pages))
    {
          include($pages[$_GET['p']]);
    }
}

如果您想让页面数组更易于管理,您可以将其分成多行:

$pages = array(
'home'=>'index.php',
'register'=>'registerpage.htm',
'etc'=>'/home/user/public_html/directory/etc.php'
);

哦,另外,因为主页是http://www.domain.com/?p=home有点难看,如果 p 的值不在数组中或不是数组键,取决于您使用的键。

所以:

if(isset($_GET['p']) && in_array($_GET['p'],$pages)) //You can combine these like this as well, same functionality.  If p isn't set, it won't even try the in_array()
{
    include($_GET['p'] . '.php');
}
else
{
    include('home.php');
}

然后,如果 !isset $_GET['p'] 或 $_GET['p'] == '' 在顶部,您就可以摆脱它。您还可以使用 && 将 isset 和 in_array/array_key_exists 组合到相同的 if 语句中。如果第一个评估是错误的并且它遇到 && 那么它只是停止并且不评估其余的,所以没有错误或任何东西,这也意味着您可以轻松地设置一次默认响应,因为将它们嵌套意味着您必须为两个 if 设置默认值。

更多编辑。如果您真的想在用户尝试转到不存在的 ap= 而不是仅仅引导到主页时获得 404,您可以在顶部执行此操作:

if(isset($_GET['p']))
{
$fourohfour = true; 
}

然后在 If 结构中向下包含页面,在 else 包含 home.php 之前执行 else if,例如:

else if(isset($fourohfour))
{
    include('404.php');
}

因此,如果 p 已设置但未检出,则它将包含 404,但如果未设置,它将转到 home.php

于 2011-01-05T02:59:56.593 回答