我使用MVC过于复杂并导致重复代码吗?

时间:2010-10-31 17:27:31

标签: php model-view-controller

我已经编写了自己的PHP MVC但是我很难区分模型和控制器部分。例如,使用将数据添加到数据库的简单表单,控制器从请求对象中提取表单数据,并将其传递给Model以处理实际的数据库插入。但是在这里似乎有很多有些重复的代码,完全删除模型部分并简单地让控制器执行数据库插入是不是更简单?

据我所知,在某些情况下,我可能有多个控制器使用相同的模型操作,但是在偶然的时间发生这种情况似乎并不值得为了不断分离模型和控制器而需要的所有额外编码?

这不是重复的代码,它似乎是一种冗长的做事方式,因为我正在为本质上简单的函数编写大量代码,如果这有意义的话?

来自控制器的示例代码

// processes the new site data
public function add_new_process() {
    // execute action in model
    $Model_Websites = new Model_Websites();
    $name           = $this->request->getPropertyFiltered('sitename',array('sanitize'));
    $descrip        = $this->request->getPropertyFiltered('descrip',array('sanitize'));
    $url                = $this->request->getPropertyFiltered('siteurl',array('sanitize'));
    $signup_url = $this->request->getPropertyFiltered('signupurl',array('sanitize'));
    $acct_id    = $this->request->getPropertyFiltered('acct_id',array('sanitize'));
    $thumbnail  = $this->request->getPropertyFiltered('thumb',array('sanitize'));
    if($Model_Websites->addNewSite($name,$descrip,$url,$signup_url,$acct_id,$thumbnail)) {
        $this->request->addFeedback("Your new website has been added succesfully!");
        $this->request->setFeedbackStatus(true);
        $this->request->storeFeedbackInSession();
        $this->template->redirectBrowser(__SITE_URL.'/websites/');
    } else {
        $this->template->setProperty('page_title', Registry::getConfig('site_name').' :: Add New Website' );
        $this->template->render('websites','show_form'); // controller,view
    }
}

Model

的示例代码
function addNewSite($name,$descrip,$url,$signup_url,$acct_id,$thumbnail) {
    $pdo = ConnectionFactory::instance()->getConnection();
    $stmt = $pdo->prepare("INSERT INTO {$this->db_table_websites} SET 
                name = :name
            , descrip = :descrip
            , url = :url
            , signup_url = :signup_url
            , acct_id = :ccbill_site_id
            , thumbnail = :thumbnail
            ");
    $stmt->bindParam(':name', $name, PDO::PARAM_STR);
    $stmt->bindParam(':descrip', $descrip, PDO::PARAM_STR);
    $stmt->bindParam(':url', $url, PDO::PARAM_STR);
    $stmt->bindParam(':signup_url', $signup_url, PDO::PARAM_STR);
    $stmt->bindParam(':acct_id', $acct_id, PDO::PARAM_STR);
    $stmt->bindParam(':thumbnail', $thumbnail, PDO::PARAM_STR);
    if($stmt->execute()) return true;
        else return false;
}

3 个答案:

答案 0 :(得分:4)

嗯,问题是你是否想要使用MVC。如果你想使用MVC,那么你就不应该把业务逻辑放到控制器中,因为那不是它应该存在的地方。请仔细阅读

然而,没有人强迫你使用MVC。这是一种常见的模式,当您想要创建可维护的应用程序时,最好使用它。特别是业务逻辑和表示层的分离使其值得考虑。但是对于小型应用程序和网站,MVC可能超大。您也可以使用一堆事务脚本构建您的站点,其中每个脚本处理来自UI的单个请求。看看

可能的替代方法。


至于你的代码,我不认为它太复杂了。由于冗长的代码,它看起来可能就像它一样。您可以通过创建FilterChainalternative)来简化它,在调用控制器之前透明地清理所有输入。您可以创建form use grouping,这样您就可以将$form['site']传递给您的模型,其他值就是其中的子键。此外,您正在进行三次调用以设置可能在一次调用中处理的反馈。也许你可以编写一个反馈帮助器来为你做三个调用,但这只会暴露一个方法并在内部完成剩下的工作(或者让它接受三个参数或任何必要的东西来减少添加反馈消息所需的工作)。

答案 1 :(得分:2)

我不是要粗鲁,所以请不要错误地评论我的意见......

但是,如果您正在努力解决模型与控制器之间的责任之间的差异,那么MVC可能不是您尝试解决的问题的正确答案。 MVC只是一种模式,并不一定适用于所有情况。

但是,回答你的问题......

模型表示应用程序正在处理的对象。诸如订单,客户和发票之类的东西是电子商务应用程序中的模型示例。 MVC与Active Record模式相结合也意味着模型会持久存储并从数据库中检索自己。

控制器是这三环马戏团的指挥。控制器有责任与模型通信,并向它们发送适当的消息(如保存,删除等)。

查看负责获取控制器已获取,创建等并显示它们的数据(即模型)。视图可以呈现为HTML,JSON或其他任何内容。

而且,作为结束评论......是否还没有为PHP编写的MVC框架?

答案 2 :(得分:0)

您的控制器在视图和模型之间执行所有数据操作。这可以根据需要解析数据,数学操作等。该模型只保存/更新/删除记录。所以不要删除Controller或Model。试着不要在层之间混合任务。