2016-06-22 8 views
1

以下の例は、私が現在どのように作業しているかを示しています。MVC - URLから表示するより良い方法をお探しください

index.phpにはindex_controller.phpとindex_template.phpが含まれます。

$uri = explode('/', $_SERVER['REQUEST_URI']); 
$action = $uri[1]; 
$call = $uri[2]; 

$tmp = explode('?', $call); 
$call = $tmp[0]; 

$call = preg_replace('/-/', ' ', $call); 

switch ($action) { 
    case "about": 
     $page = "about.inc.php"; 
     $title = "About Us"; 
     $description = "Description of page"; 
     break; 
    case "category": 
     try { 
      //PDO query to make sure category ($call) exists 
     } 
     catch (PDOException $e) { 
      logError($e->getMessage()); 
     } 
     if (query->rowCount() < 1) { 
      $page = "404.inc.php"; 
      $title = "404 Error"; 
     } 
     else { 
      //Meta information for selected category pulled from DB and put into variables. 
      $page = "category.inc.php"; 
     break; 
    default: 
     $page = "404.inc.php"; 
     $title = "404 Error"; 
} 

index_controller.php上記の例では、switch文で約12の異なるページ・オプション2を示しています。簡単なリクエスト(about)とより複雑なリクエスト(category)。

index_template.phpには、すべて私のhead、body、およびfooter HTMLがあります。誰かがmysite.com/category/booksindex_controller.phpに行く場合は、ページのメタデータを設定サイト構造を設定し、$page変数は上記の例を使用index_controller.php

にに設定されているものは何でもファイルが含ま書籍カテゴリが存在するかどうかを確認し、それがある場合はcategory.inc.phpが含まれます。

category.inc.php選択したカテゴリのアイテムのリストを表示するために必要なすべてのアイテムと情報を取得するための別のPDOクエリを実行します。また、返された項目の表示を構造化するためのテンプレートファイルも含まれています。

私はMVC型構造(CodeigniterやCakePHPのようなフレームワークを使用しない)を実現しようとしていますが、モデルの終了は実際にはありません。

現在使用しているインクルードのすべてではなく、クラスや関数を使用してURLからビューにユーザーを移動させるにはどうすればよいですか?

上記の他のファイルについて説明してもらえなかったと感じたら、それらのファイルのコード例も提供できます。

ご意見、ご提案、ご感想をお待ちしております。

EDIT:下記のコメントごとに明確な質問。

+0

このかなり広い質問です。 「MVCフレームワークを構築するにはどうすればいいの?質問のタイトルはもう少し具体的なことを示唆していますが、あなたはそれを本当に明確にしません。まだあなたが[ヘルプ]を見ていない場合は、このサイトと通常のフォーラムとの違いを理解することが重要です。あなたは会話を開始していないので、特定の質問に集中する必要があります。それがサイトの「話題になっている」ことを確認してください。 – IMSoP

+0

@IMSoP広い質問を申し訳ありません。実際の質問を明確にするために編集しました。これが私が探しているものをよりよく理解するのに役立ちます。 – Jay

答えて

0

ちょっとした工夫をして.htaccessとすると、これをはるかに簡単にすることができます。

私はこのメソッドを自分で作成したMVCベースのアプリケーションで使用します。コード全体をコピーして貼り付けることも、一部だけをコピーすることもできます。メインロジックはBootstrapクラスにあります。

の.htaccess

Options -Indexes 

RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-l 

RewriteRule ^(.+)$ index.php?url=$1 [QSA,L] 
RewriteRule ^$ /news [R] 

のindex.php

require 'brInit.php'; 

$app = new \brInclude\brClasses\mvc\Bootstrap(); 

私は自動的にクラスを含めるようにbrInitを使用して、私の設定ファイルを含めるように

bootstrap.phpの

class Bootstrap { 
    private $url = array(); 
    /** @var Controller $controller */ 
    private $controller; 

    function __construct(){ 
     try { 
      $this->_getUrl(); 

      $this->_loginUser(); 

      if(!$this->_setController($this->url[0])) 
       throw new Exception('404'); 

      if(!$this->_executeControllersMethod()) 
       throw new Exception('404'); 
     } catch(Exception $e){ 
      $this->_error($e->getMessage()); 
     } 
    } 

    private function _error($msg){ 
     $this->url = array('Error', 'error', $msg); 
     $this->_setController($this->url[0]); 
     $this->_loginUser(); 
     $this->_executeControllersMethod(); 
    } 

    private function _getUrl(){ 
     if(isset($_GET['url'])) 
      $this->url = explode('/', rtrim($_GET['url'], '/')); 
     else 
      $this->url = array('news'); 

     unset($_GET['url']); 
    } 

    private function _setController($name){ 
     $path = 'brInclude/brMVC/controller/'; 
     if(!file_exists($path)) return false; 

     $url = ucfirst($name) . 'Controller'; 
     $namespace = str_replace('/', '\\', $path); 
     $file = $path . $url . '.php'; 
     if(!file_exists($file)) return false; 

     $classWithNamespace = $namespace . $url; 
     $this->controller = new $classWithNamespace; 
     $this->controller->view->name = $name; 
     return true; 
    } 

    private function _loginUser(){ 
     $model = new UserModel(); 
     $user = $model->login(); 
     Controller::$user = $user; 
    } 

    private function _executeControllersMethod(){ 
     if(isset($this->url[1])){ 
      if(method_exists($this->controller, $this->url[1])){ 
       $count = count($this->url); 
       if($count > 2) 
        call_user_func_array(
         array($this->controller, $this->url[1]), 
         array_slice($this->url, 2) 
        ); 
       else 
        $this->controller->{$this->url[1]}(); 
      } else { 
       return false; 
      } 
     } else { 
      $this->controller->index(); 
     } 
     return true; 
    } 

    public static function isLoginRequired(){ 
     return self::$loginRequired; 
    } 
} 
+0

こんにちは:)ここにはたくさんのコードがあります(コード内のコメントでも)。 「小さなトリック」とは何ですか?コードのどの部分が特に質問に関係していると思いますか? (質問自体はかなり広いと思います...) – IMSoP

+0

こんにちは!申し訳ありませんが、私の悪い。だからここで私は '.htaccess'を使ってリクエストuriをgetパラメータとして渡し、それをPHPで分割します。これで配列が得られます。配列の最初の項目はどのコントローラーを含めるべきかを宣言します(デフォルトのコントローラーを設定できますが、何も設定されていないときにリダイレクトするには '.htaccess'を使用します)。 2番目のアイテムは、選択されたコントローラと他のすべてのアイテムがそのメソッドのパラメータである場合のメソッドです。 – Nergal

+0

@Nergalあなたの答えをありがとう!これは私が現在行っていることよりもはるかにきれいに見えます。私のコードであなたの例の部分を使うことは、私が探している道を私を助けてくれるだろう。 – Jay

関連する問題