0

私は Frontpage/Page Controller(s) として以下を使用していますが、これまでのところ問題なく動作していますが、$pages 配列とスイッチである 2 つの問題を除いて、実際には私よりもはるかに長いです。ここに貼り付けました。新しいページ コントローラーが必要になるたびに、それを $pages 配列に追加して切り替える必要があるため、リストが非常に長くなります。この問題をどのように解決しますか? また、このコードで他に何か改善点はありますか? loadLogic()ページ コントローラーでは、pages/controllername/logic/function.php の下の関数を取得するために使用されます。

フロントページコントローラー - 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():

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

フロントページコントローラーの場合、なぜこれほど多くのケースステートメントがあります。どのページを含めることが有効であるかをすでに知っており、それが有効なページにあるかどうかを確認します。

あなたはただすることができます:

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ステートメントに結合することもできます。最初の評価がfalseで、&&に達すると、停止して残りの評価を行わないため、エラーなどは発生しません。また、ネストされているということは、デフォルトの応答を1回だけ簡単に設定できることを意味します。両方のifのデフォルトが必要です。

その他の編集。ユーザーがホームページを起動するだけでなく、存在しないap =に移動しようとしたときに、本当に404が必要な場合は、上部でこれを行うことができます。

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

次に、ページを含めるためにIf構造体を下に移動し、elseの前にelseを実行して次のようにhome.phpを含めます。

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

そのため、pが設定されているがチェックアウトしない場合は、404が含まれますが、設定されていない場合は、home.phpに移動します。

于 2011-01-05T02:59:56.593 に答える