我使用以下作为Frontpage / Page Controller(s)并且它到目前为止工作正常,除了我面临的两个问题,你可以看到$ pages数组和开关,它实际上要长得多我贴在这里的那个。每次需要一个新的页面控制器时,我必须将它添加到$ pages数组并切换,这使得该列表非常长。你如何克服这个问题,你看到这个代码有什么其他改进吗?页面控制器中的loadLogic()
用于获取pages / controllername / logic / function.php下的函数。
Frontpage Controller - 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():
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
答案 0 :(得分: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的值不在数组中或者不是数组键,则将home设为默认包含,具体取决于哪个你会用的。
所以:
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语句中。如果第一次评估是错误的,它会触及&& amp;然后它只是停止并且不评估其余的,所以没有错误或任何东西,这也意味着你可以轻松设置一次默认响应,因为嵌套意味着你必须有两个ifs的默认值
更多修改。如果你真的想在用户试图进入p =不存在而不是刚刚启动到主页的情况下拥有404,那么你可以在顶部执行此操作:
if(isset($_GET['p']))
{
$fourohfour = true;
}
然后在If结构中包含页面,如果在else之前包含home.php,请执行其他操作:
else if(isset($fourohfour))
{
include('404.php');
}
因此,如果p已设置但未检出则会包含404,但如果未设置,则会转到home.php