3

私は MVC を学習しようとしています。URL が www.example.com/store の場合にストア ページを表示し、URL が www.example.com/store/cart の場合に別のカート ページを表示したいと考えています。どちらのメソッドも 1 つのクラス内にあります。

class store extends controller {
    function __construct() {
        parent::__construct ();
    }

    function Store() { //this should display the store page
        $this->view->render ( "store" );
    }

    function cart() { //this should display the cart page
        $this->view->render ( "store", "cart.php" );
    }
}

このメソッド$this->view->render()には、html コードを含むページが含まれます。URL に基づいて実行するメソッドを決定するにはどうすればよいですか?

4

3 に答える 3

10

独自の MVC を作成しようとしていることがわかりますので、これを行う際に注意すべきことを説明しようと思います。

MVC を作成するときに最初にしたいことは、Front Controller パターンを利用することです。これは、すべての HTTP リクエストが index.php という 1 つのファイルを通過することを意味します。これは、アプリケーションを 1 つのファイルに構成するのに役立ちます。常に言うことを開くだけでこれを行うことができます:

www.example.com/index.php/controller/method/param1/param2

または、ユーザーに .htaccess ファイルを使用して index.php を通過させることもできます。Codeigniter や CakePHP などの他のフレームワークの参照については、.htaccess ファイルの使用方法を参照してください。

フロントコントローラーファイルにいるときは、HTTP リクエストを適切なコントローラー/メソッドにルーティングすることを検討する必要があります。それを達成する方法は本当にたくさんあります。それを行うための最良の方法を見つけるのはあなた次第です.

とにかく、URL を分析し、URL から必要な Controller / Method / Params を抽出する Router クラスが必要です。次に、呼び出す必要があるコントローラー/メソッドがわかったら、コントローラーをインスタンス化し、必要なメソッドを呼び出す Dispatcher クラスが必要です。また、メソッドに渡してそこで使用できるようにする Params についても検討する必要があります。

これをいじる最も簡単な方法は、クエリ文字列を使用することです。

たとえば、次のような URL があるとします。

http://localhost/test/index.php?controller=home&method=welcome

コントローラーとメソッドの名前を簡単に取得できます。

これで、次のようなことができます。

// Get controller and method names
$controller = $_GET['controller'];
$method = $_GET['method'];

// Instantiate controller object
$app = new $controller();

// Call method on you controller object
call_user_func_array(array($app, $method));

これは、遊ぶためだけにできる最も簡単なことのようなものです。これを理解したら、次のように Router クラスを記述します。

http://localhost/test/index.php/controller/method/param1/param2

とにかく、これらのクラスが必要です:

すべてのリクエストが 1 つのファイルを通過するフロント コントローラーです。ここで、アプリケーションのブートストラップ、クラスの自動読み込みの登録、すべての設定などを行います。これはクラスではなく、すべてを起動する手続き型コードを含むファイルです。

URL を分析し、呼び出されたメソッドに渡したいコントローラー、メソッド、およびパラメーターを返すルーター。

Controller をインスタンス化し、Params を Method に渡す Method を呼び出すDispatcher 。

そして、すべての制御がシステムのユーザーに渡され、コントローラー/メソッド内で魔法を実行します。

リクエストをディスパッチしている間、これを使用することもできます:

call_user_func_array(array($app, $method), $params);

このように $params を $method に渡すので、メソッド内で $params を使用できます。

また、Reflection クラスを確認してください。これは、呼び出したいメソッドが存在するかどうかを分析するのに役立ちます。存在しない場合は、HTTP 404 などを呼び出す必要があります...

あなたの質問に対する簡単な答えはありませんが、これがお役に立てば幸いです。システムの構築を楽しんで、完璧になるまで改善してください:)

于 2013-04-08T12:33:55.383 に答える
2

リクエストをコントローラにルーティングする別の Router クラスが必要です。Symfony の Routerを参照/コピーすることをお勧めします。

于 2013-04-08T11:39:17.517 に答える
1

私はかつて自家製のアプローチのためにこのようなことをしました。.htaccess (apache) / Web.config (iis) を使用して、すべてのリクエストを次のスクリプトにリダイレクトします。

// include callable controllers here
$partsA = explode("?", $_SERVER['REQUEST_URI']); // split querystring
$partsB = explode("/", $partsA[0]); // get url parts
if (count($partsB) < 2)
    die("missing controller in url");
elseif (count($partsB) < 3)
    die("missing action in url");
$className = $partsB[1];
$methodName = $partsB[2];
if (class_exists($className))
    if (!is_subclass_of($className, "controller"))
        die(htmlspecialchars("Class $className doesn't extend controller")); // prevents use of unauthorized classes
    else
        $controller = new $className();
else
    die(htmlspecialchars("Class $className doesn't exist"));

if (!method_exists($controller, $methodName))
    die(htmlspecialchars("Method $methodName doesn't exist"));
else
    $controller->$methodName();
于 2013-04-08T12:17:55.737 に答える