0

Web アプリケーションの MVC デザイン パターンを学ぼうとしているので、独自の PHP MVC フレームワークを作成することにしました。この投稿を書く前に、MVC に関するチュートリアルやフォーラムをたくさん読みました。これで、MVC のアイデアと、コントローラーとモデルとビューの通信方法をよく理解できました。ルーターといくつかのモジュール(ログイン、カテゴリなど)を書きました-動作しているようです。

今、私は少し混乱しています:

呼び出すlocalhost/LogInとログイン フォームのみが表示され、呼び出すlocalhost/categoriesとカテゴリ リストが表示されます。すべて問題ありませんが、インデックス コントローラーを作成したいと思います。呼び出すときにlocalhost/index、ログイン フォーム、カテゴリ、その他のモジュールを表示したいと考えています。

からコントローラ (ログイン、カテゴリ) を呼び出す必要がありますindexController.phpか?

必要なモジュールを 1 ページに連結する方法についてアドバイスが必要です。

4

3 に答える 3

0

いくつかのものが必要です:

  1. すべてのリクエストがインデックス ファイルを通過するようにする .htaccess ファイルが必要です。これは単純なものです。

    RewriteEngine On
    RewriteBase /demo
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-l
    
    RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
    
  2. index.php ファイルでインクルード パスを設定する必要があるため、選択したモジュール/コントローラー/ビューまたはその他のクラスを明示的に含める必要はありません。

     define("APPLICATION_PATH", realpath('.'));
     $paths = array(
        APPLICATION_PATH.'/controllers',
        APPLICATION_PATH.'/models',
        APPLICATION_PATH.'/views',
        APPLICATION_PATH.'/libs',
        APPLICATION_PATH.'/includes',
        get_include_path()
    );
    
    set_include_path(implode(PATH_SEPARATOR, $paths));
    
  3. クラスを自動ロードするための「マジックメソッド」を追加し(自動的に呼び出されます)、Bootsrap クラスを初期化します。

    function __autoload($className){
    $fileName = str_replace('\\','/', $className);
    require_once "$fileName.php";
    }
    new Bootstrap();
    
  4. Bootstrap.php:

    <?php
    class Bootstrap {
    
        public function __construct() {
    
            $url = $_GET['url'];
    
            $params = explode('/', $url);
    
            //if controller exist - call it, else call login controller
            if (isset($params[0]) && $params[0]){
                $controller = new $params[0]();
            }
            else{
                $controller = new login();
            }
    
            //if method exist - call it, else call index method
            if (isset($params[1]) && $params[1]){
    
                //if parameter exit - call method with param, else call witout param
                if (isset($params[2]) && $params[2]){
                    $controller->$params[1]($params[2]);
                }
                else{
                    $controller->$params[1]();
                }
            }
            else{
                $controller->index();
            }
        }
    }
    

これで、基本的な MVC フレームワークが得られます。

于 2012-07-10T08:19:30.190 に答える
0

いいえ、コントローラーは互いの関数を呼び出すべきではありません。一部のフレームワークでは、必要なものを実装するために「ヘルパー」が導入されています。

コントローラーは同じモデルを使用できますが、とにかくビューは異なるため、カテゴリー モデルを使用して表示するカテゴリーを提供し (例: $categories->getCategoriesList())、それをカテゴリー コントローラー ビューとインデックス コントローラー ビュー。

あるコントローラーを別のコントローラーから呼び出す正当な方法は、HTTP 要求を形成することです。たとえば、AJAX を介してビューに表示する HTML スニペット (別のコントローラーがレンダリングしたビュー) を受信するか、別のコントローラー (主にアイデアの説明のための不器用なソリューション)。

于 2012-07-10T08:11:46.007 に答える