Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP Frontpage/页面控制器_Php_Software Design - Fatal编程技术网

PHP Frontpage/页面控制器

PHP Frontpage/页面控制器,php,software-design,Php,Software Design,我使用以下内容作为Frontpage/页面控制器,到目前为止,它工作正常,但您可以看到,我面临的两个问题是$pages数组和开关,它们实际上比我在这里粘贴的要长得多。每次需要一个新的页面控制器时,我都必须将它添加到$pages数组中并切换,这使得列表非常长。您将如何克服这个问题?您是否看到此代码有任何其他改进loadLogic()在页面控制器中,它用于获取pages/controllername/logic/function.php下的函数 Frontpage控制器-index.php: inc

我使用以下内容作为Frontpage/页面控制器,到目前为止,它工作正常,但您可以看到,我面临的两个问题是$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';
函数loadLogic():

文件夹结构:

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

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

您只需执行以下操作:

if(isset($_GET['p']))
{
    if(in_array($_GET['p'], $pages))
    {
         include($_GET['p'] . '.php');
    }
}
如果希望将不同的名称传递给$\u 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'
);
哦,还有,因为主页有点难看,所以如果p的值不在数组中或者不是数组键,只需将home设置为默认的include,这取决于您使用的是哪一个

因此:

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

更多编辑。如果您真的想在用户尝试转到不存在的p=时使用404,而不是直接启动到主页,您可以在顶部执行此操作:

if(isset($_GET['p']))
{
$fourohfour = true; 
}
然后在If结构中包含页面,在else include home.php之前执行else If,如:

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

因此,如果设置了p但没有签出,那么它将包含404,但如果未设置,它将返回主页。php

@Phoenix感谢您的建议,到目前为止,您还可以告诉我frontpage/page controller的一般情况吗?有什么建议吗?我会再等一两个小时,如果这个问题没有更多的答案,我会把你的标记看作是被接受的。嗯,你可以考虑如何去做。HTAccess重写规则,这样当一个用户去到p= pGeOne时,它就会显示为/pGeOne。您还可以使用与首页控制器上相同的逻辑来控制子页的子页。我曾经有过一个类似的系统,它有一个文本文件库,而?p=library将直接进入一个图书索引,而?p=library&lib=book1将进入图书。library页面默认包含图书索引,并使用file_exists()检查指定目录中的txt文件中的$u GET['lib'],如果未包含,则检查默认值。此外,另一种混淆形式是更改扩展名。包含的文件可以有任何扩展名,可以是home.gobbledygook。Include与treats几乎一样,如果在其中找到php代码,它将运行它。您可以将.php重命名为.jpg,它将运行代码。只需确保apache或您正在使用的任何服务器在直接请求时将其视为php文件,或者不允许从服务器外部访问,因为如果有人猜到名称和扩展名,则可以下载源代码,但即使您没有,源代码仍会运行,这就是为什么你永远不应该直接包含()用户上传的文件,即使你知道它应该是.jpg而不是.php,尽管我不明白为什么有人会这么做。@Phoenix你认为在页面控制器上实现模板逻辑容易吗?如果是,文件夹结构将如何?
if(isset($_GET['p']))
{
$fourohfour = true; 
}
else if(isset($fourohfour))
{
    include('404.php');
}