0

私はカスタムMVCスタイルのフレームワークを最初から作成していて、で何が起こるかを制御するためのコードを実装する必要がある時点にいPOSTます。

現在、コントローラーとして機能し、次のような他のコントローラーにデータを渡すメインのindex.phpがあります。

profilecontroller.class.php forumcontroller.class.php

現時点では、POSTコントローラーをどこに配置できるかについて2つのオプションがあります。

最初のアプローチ

まず、任意のページで発生する可能性のあるログインなどのサイト全体の投稿の場合、最初のindex.phpで次のようなものを使用して、すべてのPOSTを特定のPOSTコントローラーにリダイレクトし、データをモデルに送信して処理します。

if($_POST)
    //post controller, works on specific form id's

代替アプローチ

私が見る他のオプションは、POST識別子をモデル構築セクションに組み込むことですが、常にチェックされ、より多くのコードがロードされるため、これは非常に管理しやすく/賢明ではないと思いますか?

そこに良い/簡単な例はありますか?

私は自分のmvcをできるだけ軽くするように作成しているので、それがゼロから始める理由です。

4

2 に答える 2

3

RESTfulセットアップでは、通常、オブジェクトのコントローラー、たとえば、、次に、、newsなどのアクションがあります。addeditdelete

次に、アクション内で、メソッドにアクセスするために使用する必要があるHTTPメソッドをアサートする必要があります。例えば:

<?php
class NewsController extends AbstractController {
    public function save() {
        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
            header('HTTP/1.1 405 Method Not Allowed');
            die('Please use POST.');
        }
        // carry on knowing we're working with a POST request
    }
}

あなたが言うように、POSTリクエスト用に別のコントローラーを作成すると、すぐに手に負えなくなり、管理できなくなります。

さまざまなコントローラーアクション内でさまざまなHTTPメソッドの要求を処理する方法を探している場合は、ToroPHPをチェックしてください。これは軽量(単一ファイル)ルーターであり、ハンドラーと呼ばれるクラスにリクエストをマップすると、そのハンドラーにはさまざまなHTTPメソッドのメソッドが含まれます。簡単な例:

<?php

require 'lib/torophp/toro.php';
require 'classes/handlers/HomeHandler.php';

$toro = new ToroApplication(array(
    array('/', 'HomeHandler')
));
$toro->serve();

そして、あなたHomeHandlerは次のようになります:

<?php
class HomeHandler {
    public function get() {
        echo 'Hello, world!';
    }
    public function post() {
        echo 'Try performing a GET request for the home page, buddy.';
    }
    // and so on...
}

お役に立てば幸いです。

于 2012-04-27T18:45:00.650 に答える
0

これは私のデフォルトのコントローラーです:

<?php
Class Controller_Home{
    public $Registery = null;

    final public function __construct($Registery){ $this->Registery = $Registery; }

    final public function Init($Method=null){
        # Quelle action on fait ?
        if($Method){
            $Split = explode('_', $Method);

            $MethodName = 'Action';
            foreach($Split as $Splitted){
                $MethodName.= '_'.ucfirst($Splitted);
            }

            if(method_exists($this, $MethodName)){
                $this->$MethodName();
            } else {
                echo '404';
                die;
            }
        } else {
            $this->Action_Default();
        }
    }

    final public function Action_Default(){
        $this->Registery->Import('Library.Account');

        var_dump($this->Registery->Account);
        echo 'Default Home';
    }
}

ご覧のとおり、Action_Defaultに入ると、$ _ GET、$ _ POSTに基づいて、好きなことを行うことができます...

したがって、このコードでは:

website.com/home/bob/はAction_Bobコントローラー内の関数を使用しますHomeHome::Action_Bob)...$_POSTがAction_Bobこの中に置かれているのが表示された場合

public function Action_Bob(){
    if($_POST){
        $this->Action_Bob_Post();
    }
    // continue
}
于 2012-04-27T18:28:48.707 に答える