2011-01-05 4 views
0

私はFrontPage/Page Controllerとして次のものを使用しています。これまでのところうまくいきましたが、私が直面している2つの問題を除いて、$ pages配列とswitch私がここに貼り付けたものよりもはるかに長い。新しいページコントローラが必要になるたびに、それを$ pages配列に追加し、そのリストを非常に長くするスイッチを切り替えなければなりません。どのようにしてこの問題を克服し、このコードの他の改善が見えますか?ページコントローラ内のloadLogic()は、/ controllername/logic/function.phpページの下で機能を取得するために使用されます。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!'; 
    } 
} 

ページコントローラ - {家庭、登録、ログイン、ログアウト、1ページ目、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 

答えて

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の値が配列の中にないか、配列キーでない場合は、あなたが使うものに応じて、デフォルトのインクルードにするだけです。だから、

:!の

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文に組み合せて& &にすることもできます。最初の評価が偽で、それが& &にヒットした場合、それは停止して残りの部分を評価しないので、エラーも何もありません。また、ネストされた手段としてデフォルト応答を簡単に1回だけ簡単に設定できることを意味しますあなたは両方のifsのデフォルトを持っていなければなりません。

編集が増えました。

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

し、その後でダウンを:あなたは本当にユーザーがAPに行くしようとする=そのだけではなく、ホームページにブートばかりの非existantです、あなたがトップでこれを行うことができたときに404を持っていると思った場合構造体がページを含める場合は、elseがホームをインクルードする前にelseを実行します。以下のようなPHP:

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

pが設定されているが、チェックアウトしていない場合、それは404が含まれるように、それが設定されていない場合、それはあなたに感謝@Phoenix

+0

をhome.phpに行きますこれまでのあなたの提案では、一般的なフロントページ/ページコントローラについて私に教えてくれるものがありますか?任意のヒント?もう1時間か2時間待つつもりです。この質問にもう答えがない場合、私はあなたの名前を受け入れたものとしてマークします。 – afarazit

+0

まあ、ユーザーが?p = pageoneに行くと、/ pageoneとして表示されるように、.htaccess書き換えルールの実行方法を調べることを検討するかもしれません。また、フロントページコントローラーと同じ種類のロジックを使用して、サブページのサブページを制御することもできます。私は似たようなシステムを一度、テキストファイルのライブラリで使いました。そして、?p = libraryは単に書籍のインデックスに行き、?p = library&lib = book1は本に行きます。ライブラリのページにはデフォルトのインクルードのブックインデックスがあり、file_exists()で指定されたディレクトリのtxtファイルに対して$ _GET ['lib']をチェックしていました。 – Phoenix

+0

また、別の形式の難読化が拡張を変更しています。インクルードされたファイルは文字通り任意の拡張子を持つことができ、home.gobbledygookにすることができます。それはそれを実行します、内部にPHPコードを見つける場合、すべての同じを含むかなりの扱いを含める。 .phpの名前を.jpgに変更すると、コードが実行されます。ちょうど誰かが名前と拡張子を推測したならば、ソースがダウンロード可能になるので、あなたが直接要求された場合にはApacheやそれが使用しているサーバをphpファイルとして扱うようにしてください。あなたがしなかったとしてもそれはまだ動くでしょう。 – Phoenix

関連する問題