Php 我对MVC的使用是不是过于复杂,重复代码?

Php 我对MVC的使用是不是过于复杂,重复代码?,php,model-view-controller,Php,Model View Controller,我已经编写了自己的PHP MVC,但是我很难区分模型和控制器部分。例如,对于将向数据库添加数据的简单表单,控制器从请求对象中提取表单数据,并将其传递给模型以处理实际的数据库插入。然而,这里似乎有很多重复的代码,完全删除模型部分并让控制器插入数据库不是更简单吗 我知道,在某些情况下,我可能会有多个控制器使用同一个模型动作,但有时这种情况发生时,似乎不值得不断地将模型和控制器分开所需的所有额外编码 这与其说是重复的代码,不如说是一种冗长的方式,因为我正在为一个简单的函数编写大量代码,如果这有意义的话

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

我知道,在某些情况下,我可能会有多个控制器使用同一个模型动作,但有时这种情况发生时,似乎不值得不断地将模型和控制器分开所需的所有额外编码

这与其说是重复的代码,不如说是一种冗长的方式,因为我正在为一个简单的函数编写大量代码,如果这有意义的话

来自控制器的示例代码

// 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
    }
}
来自模型的示例代码

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;
}

控制器执行视图和模型之间的所有数据操作。这可以是解析数据、数学操作等。模型只保存/更新/删除记录。因此,不删除控制器或模型。尽量不要在不同层次之间混合任务。

我不是想粗鲁,所以请不要错误地接受我的评论

然而,如果您正在努力解决模型和控制器之间职责的差异,那么MVC可能不是您试图解决的问题的正确答案。MVC只是一种模式,并不一定在任何情况下都是正确的

但是,在回答你的问题时

模型表示应用程序正在处理的对象。订单、客户和发票等都是电子商务应用程序中的模型示例。MVC与活动记录模式相结合还意味着模型可以持久化并从数据库中检索自己

控制者是这个三环马戏团的指挥。控制员负责与模型对话,并向他们发送适当的消息(如保存、删除等)

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


作为结束语。。。还没有为PHP编写的MVC框架吗?

好吧,问题是您是否想使用MVC。如果您想使用MVC,那么您不应该将业务逻辑放入控制器中,因为它不应该放在控制器中。请通过

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

寻找可能的替代方法



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

您能否给出一些示例代码,以便我们了解为什么会有重复的代码?听起来你好像做错了什么。通常情况下,控制器是胖的,而模型是瘦的,例如,您建议的让控制器做所有事情的第二种方法会导致重复代码。添加示例代码并澄清我的“问题”在本质上是一个非常简单的应用程序中,这似乎是一种冗长的工作方式。是的,你可能是对的,如果我太过重复,我可能不会使用MVC模式,因为这是一个相当简单的项目。。。我能说什么呢?无聊和好奇是危险的组合!我确实看了一下预制的框架,但是它们对于我的需求来说都显得有些笨重。谢谢,这里有一些最有用的链接。我开始意识到,对于这个特定的项目来说,MVC可能有些过分,如果只使用一组基本的事务脚本,它可能会更简单是的,我认为问题的一部分是,当我看到大量的代码时,我吓了自己一跳。您关于修剪脂肪的建议当然是有意义的,我已经在使用filter_输入作为sanitize函数的一部分,但是正如您所建议的,在request类中全局地执行此操作而不是针对每个单独的项目会更有意义。我的反馈功能肯定也需要一些清理!谢谢,你让我对以目前的形式推进这个项目感到非常舒服:)