0

我目前正在尝试制作一个处理 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,因为它们实际上是多个调查。但是它们是相关的,并且也可能返回Survey不确定它们是否应该是一个完全独立的类的实例。在这里做的最好的事情是什么?

顺便说一句,我不在乎它是否是 Drupally 的答案。

谢谢, 阿姆沙德

4

2 回答 2

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

您可以使用静态方法来处理对象组。您甚至可以有一个静态数组来保存对每个加载的调查的引用。

另一种选择是有一个“调查”类,其目的是处理调查组。以前的方法对我来说感觉更干净。

于 2013-03-09T21:35:42.013 回答
0

使用单个类来保存数据库逻辑和业务逻辑违反了关注点分离原则。我将使用分离的接口和类,比如说SurveyRepository(接口)和DrupalSurveyRepository(使用 Drupal DB 层的接口实现)来管理调查持久性(即读取和写入数据库)。这将简化(单元)测试,因为当与一些依赖注入结合以提供接口的模拟实现时,您将能够在没有数据库连接的情况下使用与调查相关的代码SurveyRepository

对于 Drupal 7+ 项目,我会考虑在实体 API 模块的帮助下将调查设为实体类型(请参阅https://drupal.org/node/1261744 ) 。然后可以使用 搜索调查,而可以使用现有的和功能进行加载和保存。EntityFieldQueryentity_load()entity_save()

于 2013-03-11T19:12:02.343 回答