我目前正在尝试创建一个用PHP处理调查的课程(Drupal)。 到目前为止,我有这个:
class Survey{
public $id;
public $uid;
public $rate;
public $reason;
public $complete;
public $opinion;
public function save(){
drupal_write_record('survey', $this);
}
}
这很棒,我可以创建一个新的Survey实例,设置属性,并在其上调用save。
但是,我还希望能够从数据库中检索这些调查结果的方法并对其进行操作,为我提供各种数字。在类Survey
中使用这些方法感觉不对,因为它们实际上是多个 Surveys 。但是它们是相关的,并且还可能返回Survey
的实例,因此不确定它们是否应该是完全独立的类。这里最好的事情是什么?
BTW我不在乎它是否是一个Drupally答案。
谢谢, Amshad
答案 0 :(得分:0)
与任何事情一样,有许多方法各有利弊。
我的(当前)首选项是将类方法(静态)和对象方法分别用于处理对象组和单个对象。
请考虑以下代码:
class Survey {
public $id;
public $uid;
public $rate;
public $reason;
public $complete;
public $opinion;
public function save()
{
drupal_write_record('survey', $this);
}
/**
* Loads survey from secondary storage
*
* @param string $id Unique surevy ID
*/
public function load( $id ) {
// loads a survey from secondary storage
}
/**
* Returns report of survey results.
*
* @param array $surveys array of surveys to process. If not passed or NULL,
* The whole set of completed surveys will be processed.
* @return string HTML Formatted report
*/
public static function compile_results( $surveys = NULL )
{
if( empty( $surveys ) )
{
$surveys = self::get_completed_results();
}
foreach( $surveys as &$survey )
{
// process an individual survey, possibly aggregating it
}
}
/**
* Retreives completed surveys from secondary storage.
*
* @return array Array of completed Survey objects
*/
public static function get_completed_surveys()
{
$surveys = array();
// Select all surveys from secondary storage
$survey_rows = array(); //replace with code to get surveys
foreach( $survey_rows as $survey_row )
{
$survey = new Survey();
$survey['id'] = $survey_row['id'];
$survey['uid'] = $survey_row['uid'];
$survey['rate'] = $survey_row['rate'];
$survey['reason'] = $survey_row['reason'];
$survey['complete'] = $survey_row['complete'];
$survey['opinion'] = $survey_row['opinion'];
$surveys[] = $survey;
}
return $surveys;
}
}
您可以使用静态方法处理对象组。您甚至可以拥有一个静态数组,其中包含对每个已加载调查的引用。
另一种选择是建立一个“调查”课程,其目的是与调查组合作。以前的方法让我感觉更清洁。
答案 1 :(得分:0)
使用单个类来保存数据库逻辑和业务逻辑违反了Separation of Concerns原则。我会使用一个单独的接口和类,让我们说SurveyRepository
(接口)和DrupalSurveyRepository
(使用Drupal DB层的接口的实现)来管理Survey持久性(即读取和写入数据库)。这将简化(单元)测试,因为当您与一些依赖注入结合使用时,您可以在没有数据库连接的情况下使用Survey相关代码来提供SurveyRepository
接口的模拟实现。
对于Drupal 7+项目,我会考虑在https://drupal.org/node/1261744的帮助下将Survey作为实体类型(参见Entity API module)。然后可以使用EntityFieldQuery
搜索调查,而可以使用现有的entity_load()
和entity_save()
函数完成加载和保存。