2010-11-25 3 views
0

すべて、MVCを使用した動的PHPウェブサイト - これはどのようなナビゲーションパターンですか?

MVCの例として私のWeb開発クラスで与えられたいくつかのサンプルコードを勉強しています(もう一度、ウェブ用です)。このコードでは、index.phpページからさまざまなコントローラ(モデルとビューモジュールを呼び出す)にナビゲートし、index.phpに戻るシステムがあります。

私はMVCの仕組みを理解しています。

私が取り組んでいるのは、ナビゲーションメカニズムです。私はすべての作品が一緒に働く方法を理解するのが難しいです。

誰かが以下のコードを見て、これが動的なウェブサイトのナビゲーションに対処するためのよく知られた方法/パターンと一致するかどうか教えてください。 (もしかしたらフロントコントローラーかもしれない?)もしそうなら、私はもっと簡単にそれについて研究をすることができます。

多くの感謝!

JDelage

のindex.php

<?php 
require_once("User.php"); 
session_start(); 

if (isset($_GET['action'])) 
    $action= $_GET['action']; 
else 
    $action=""; 

switch ($action) { 
case 'login': 
    require_once('Login.php'); 
    $command= new LoginControler(); 
    break; 
case 'logoff': 
    require_once('Logoff.php'); 
    $command= new LogoffControler(); 
    break; 
// Several other cases 
default: 
    require_once('Unknown.php'); 
    $command= new UnknownControle(); 
} 


$command->execute(); 
require_once('EntryMenu.php'); // Those are objects that represent both the 
// menu label and the links. 
$menu= array(
     new EntryMenu("Login", "index.php", array("action" => "logon")), 
     new EntryMenu("Logoff", "index.php", array("action" => "logoff")), 
     new EntryMenu("Write", "index.php", array("action" => "write")), 
     new EntryMenu("Read", "index.php", array("action" => "read")) 
); 

if ($command->redirect) { 
    header('Location: ' . $command->redirect); 
} else if ($command->page) { 

    include("ui/header.php"); 
    include("ui/menu.php"); 
    echo "<div class='content'>"; 
    include("ui/". $command->page); 
    echo "</div>"; 
    include("ui/footer.php"); 
} 
?> 

Controler.php

<?php 
class Controler { 
    public $page= "problem.php"; 
    function execute() {} 
} 
?> 

LogoffControler.php

<?php 
require_once('Controler.php'); 
class LogoffControler extends Controler { 

    function execute() { 
    $this->redirect= "index.php"; 
    unset($_SESSION['user']); 
    } 
} 
?> 

LoginControler.php

<?php 
require_once('LoginModel.php'); // This manages the exchanges with the user db 
require_once('Controler.php'); 

class ConnexionControle extends Controler { 
    public $page= "LoginForm.php"; 

    function execute() { 

    // More code to deal with incorrectly filled login forms 

    $login = new LoginModel(); 
    $login->loginUser($_POST['login'], $_POST['password']); 
    if ($login->userLogedIn()) { 
    $_SESSION['user']= $login->user; 
    $this->redirect= "index.php"; 
    } 

// More code to deal with invalid logins 

} 
} 
?> 

答えて

4

私はあなたのコントローラ部を理解すると仮定しています、とswitch..case文について尋ねています。私はまだ正式な名前に遭遇していないが、PHPのためのほとんどのMVCフレームワーク(Kohana、CakePHP、CodeIgniter、Fat Freeなど)は、「ルーティング」と呼んでいる。これはURLのコントローラへのマッピングです。

スイッチを使用すると、文のセットが簡単な方法の1つです。より洗練されたソリューションでは、RegExを使用して、事前に定義されたURLパターンを照合して、呼び出すコントローラーとそのパラメーター(通常は「要求」としてまとめられているもの)を一致させます。

その他の方法ではURLの書き換えを使用して、

action=articles&month=nov&article-id=3 
1

あなたはMVCシステムの簡単に解剖verionをご希望の場合はあなたがしようとしているすべてのものを扱う1kb PHP MVCを試みることができる。このような「醜いURL形式」である/articles/month/nov/article-id/3

としてはるかにクリーンなファッション。実際には圧縮された形で読みたい場合は、コードを分割する必要があります。

このシステムではコントローラを/classes/controller/somthing.phpという名前で置き、http://site.com/somethingのようなURLからアクセスできます。

モデルの読み込みも簡単で、includeまたはrequireコールは不要です。

class Controller_Something 
{ 
public function index() 
{ 

    $model = new Model_User(); 
} 
} 
+0

非常にクールですが、私はそれを読むことができません。 – JDelage

+1

はい、それをすべて1KBに収める必要がありました。だから、私が言ったように、各 ";"ある行がどこで終わり、どこから始まるかを示します。代わりに、既にテスト済みで実績のある作業であるため、単純に使用することもできます。システムのコピーをダウンロードしてWebサーバーに配置して、実際の動作を確認してください。 – Xeoncross

+0

多分私はそれをダウンロードし、行ごとに行かなければなりません。それは素晴らしい運動であるように見えます。いずれにせよ、それを書いていることをお祝いします。 – JDelage

関連する問題