我已经编写了自己的PHP MVC,但是我正在努力区分模型和控制器部分。例如,对于将数据添加到数据库的简单表单,控制器将从请求对象中提取表单数据,并将其传递给Model以处理实际的数据库插入。但是,这里似乎有很多重复的代码,将Model部分完全删除并简单地让控制器进行数据库插入会不会更简单?
我知道在某些情况下我可能有多个控制器使用相同的Model动作,但是在偶然的情况下发生这种情况似乎并不值得持续分离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
}
}
来自模型的示例代码
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,则不应将业务逻辑放入控制器中,因为这不是应该的。请通过
In MVC, where do you draw the line between a controller and model?和
Fat models, skinny controllers and the MVC design pattern。
但是,没有人强迫您使用MVC。这是一种常见的模式,当您要创建可维护的应用程序时,最好使用它。特别是业务逻辑和表示层的分离使其值得考虑。但是,对于小型应用程序和网站,MVC可能过大。您还可以使用一堆Transaction脚本来构造您的网站,其中每个脚本都处理来自UI的单个请求。退房
Rasmus Lerdorf's The No Framework Framework
一种可能的替代方法。
至于您的代码,我认为这不会使事情复杂化。由于冗长的代码,它看起来可能像以前一样。您可以通过创建FilterChain(alternative)来简化它,从而在调用控制器之前透明地清理所有输入。您可以将您的form use grouping设置为,这样您就可以将$form['site']
传递给您的模型,而其他值则是该子项。另外,您正在执行三个呼叫,以设置可能在一个呼叫中处理的反馈。也许您可以编写一个“反馈帮助器”来为您执行这三个调用,但这仅公开一个方法并在内部完成其余工作(或使其接受三个参数或减少添加反馈消息所需的工作所需的任何操作) )。
请如何排序以下数组Array ( 'ben' => 1.0, 'ken' => 2.0, 'sam' => 1.5 ) 至Array ( 'ken' => 2.0, 'sam' => 1.5, 'ben' =&…
PHP PDO组按列名称查询结果 - php以下PDO查询返回以下结果:$db = new PDO('....'); $sth = $db->prepare('SELECT ...'); 结果如下: name curso ABC stack CDE stack FGH stack IJK stack LMN overflow OPQ overflow RS…
PHP strtotime困境 - php有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00…
PHP-全局变量的性能和内存问题 - php假设情况:我在php中运行一个复杂的站点,并且我使用了很多全局变量。我可以将变量存储在现有的全局范围内,例如$_REQUEST['userInfo'],$_REQUEST['foo']和$_REQUEST['bar']等,然后将许多不同的内容放入请求范围内(这将是适当的用法,因为这些数据指的是要求自…
php-casperjs获取内部文本 - php我正在为casperjs使用php包装器-https://github.com/alwex/php-casperjs我正在网上自动化一些重复的工作,我需要访问一个项目的innerText,但是我尚不清楚如何从casperjs浏览器访问dom。我认为在js中我会var arr = document.querySelector('label.input…