-2

私はシステムを構築すると同時に、OOPとMVCを学習して実装しています。

私がまだ確信が持てないのは、MVC構造にAJAXを組み込む方法だけです。そのため、私が行ったのは、さまざまなオブジェクトにアクセスして結果を返すAJAXリクエストのさまざまな「モード」に応答するタイプのコントローラーです。私のシステム。

これはこれを行うための良い方法ですか、それともシステム内の他のコントローラーとは非常に異なるこのコントローラーを使用することでMVCのルールを破っていますか?

これは私のAJAX「デリゲーター」です。

session_start() ;
function __autoload($classname)
{
include('/controllers/'.$classname.'.php') ;
}

// Deligator for contact operations.

if($_POST['mode'] == 'OPPORTUNITY_COUNT')
{
$contactManager = new ContactManager($_SESSION['userid']) ;

echo $contactManager->fetchOpportunityCount() ;

}
elseif($_POST['mode'] == 'PROSPECT_COUNT')
{
$contactManager = new ContactManager($_SESSION['userid']) ;

echo $contactManager->fetchProspectCount() ;

}
elseif($_POST['mode'] == 'CUSTOMER_COUNT')
{
$contactManager = new ContactManager($_SESSION['userid']) ;

echo $contactManager->fetchCustomerCount() ;

}
else
{
echo 'Error: Unknown mode.' ;
exit() ;
}

参考までにこれは私がルーターにデータを送る方法です:

socket.on('UPDATE_OPPORTUNITY_DATA', function(date){
    $.ajax({data: 'mode=OPPORTUNITY_COUNT', success: function(data){
        $('#opportunityCount').html(data) ;
        shaker('#opportunityCount') ;
        }
    })
})
4

3 に答える 3

1

Ninsuoのルーティングのわずかな代替手段として、これは間違いなく機能します。増え続けるswitchステートメントに何かを追加する必要があるため、DRYプリンシパルに違反していると思います。また、次の場合に対応する新しい関数を作成します。一部のコードはこれを自動的に行います。

if(method_exists($selected_controller,$_POST['either the url end or something')
{
    //I typically use reflection to tell if a method is public or private
    $reflection = new ReflectionMethod($this, $function);
    if($reflection->isPublic())
    {
        call_user_func_array(array($selected_controller,$function), $_POST['blah or url']);
    }
    else
    {
        //Render 404 - The method is protected or private
    }

}
//Render 404 - no such method exists in the controller

基本的に、使用するコントローラーを選択したら、対応するメソッドが存在するかどうかを確認し、それを実行するだけです;]。

また、クラスがすでに解析され、関数名にインデックスが付けられ、関数の呼び出しが時間計算量1の単純なハッシュ呼び出しになるという事実を利用する手法も好みます。これは、増え続けるもののリストとは対照的です。これは、すでに配置されているツールを利用していません。これにより、コード内で複数の場所で自分自身を繰り返すことになります。

于 2012-09-22T08:34:33.207 に答える
1

MVCアーキテクチャーとしてはそれほど悪くはないように見えますが、あなたがうまくやっていないのは、同じファイルでルーティングとアクションを実行することです。私はあなたに提案します:

session_start() ;
function __autoload($classname)
{
include('/controllers/'.$classname.'.php') ;
}

// Routing for contact operations.

$out = null;
switch ($_POST['mode'])
{
    case 'OPPORTUNITY_COUNT':
            $controller = new ContactController;
            $out = $controller->opportunityCountAction($_SESSION['userid']);
            break ;
    case 'PROSPECT_COUNT':
            $controller = new ContactController;
            $out = $controller->prospectCountAction($_SESSION['userid']);
            break ;
    case 'CUSTOMER_COUNT':
            $controller = new ContactController;
            $out = $controller->customerCountAction($_SESSION['userid']);
            break ;
    default:
            break ;
}

if (is_null($out)) {
    echo 'Error: Unknown mode.' ;
    exit();
}

echo $out;

次に、managerメソッド呼び出しを使用してContactControllerを実装します。

ルーティングとコントローラーの違いに関するいくつかの興味深いドキュメント。

于 2012-09-22T07:46:28.557 に答える
0

これを行うには多くの方法がありますが、最も簡単なのは、コントローラーにajaxリクエスト専用のアクションがあることです。したがって、htmlを返す代わりに、json文字列を返します。

使用しているフレームワークはわかりませんが、一般的な例を示します。

class yourController {
function updateAction()
{
  // do an normal page view 
  $this->renderView('view');  // this will be greatly different for different frameworks
}

function ajaxUpdateAction()
{
//do the ajax processing

echo json_encode($data);
die;


}

}
于 2012-09-22T07:39:48.847 に答える