-2

我正在构建一个系统,同时学习和实现 OOP 和 MVC。

我唯一不确定的是如何将 AJAX 合并到我的 MVC 结构中,所以我所采用的是一种控制器,它响应来自 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 路由的一个小替代方案,它绝对有效。我觉得它违反了 DRY 原则,因为你必须在不断增长的 switch 语句中添加一些东西,同时还要创建一个新函数,当你可以拥有时对应一些代码会自动执行此操作。

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;

然后你使用管理器方法调用来实现你的 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 回答