0

我想就设计理念寻求建议。我创建了自己的 MVC 框架。

对于模型类,这些是主要从我的数据库中检索数据的类。

在一个类中,例如(User),我有以下方法

  • get_user.
  • get_recent_activity.

基本上例如在get_recent_activity方法中,我将有一个执行执行以获取数据的 sql 语句。

我正在考虑另一种设计,即User用一个类扩展每个类(例如)Sql。在这个类中,它将包含所有 sql 必要的查询。

例如,使用 sql 类的插入查询将类似于

$sqlqueries->select("table","user=john&email=john@hotmail.com");

这会是一个更好的设计吗?为了维护还是什么?我担心性能问题,因为现在要从方法中获取数据,首先 sql 类中的 select 方法需要先处理变量。

4

2 回答 2

0

您提到的 Sql 类对我来说看起来像一个存储库模式。Indeed 具有维护优势,但也有助于单元测试、更好的关注点分离和更简洁的代码。

于 2012-06-20T12:40:21.190 回答
-1

这是我在使用数据库时如何设计自己的框架类的个人帐户。

通常,在设计 MVC 框架时,我会列出开发类的两个核心概念:

  • 管理各个方面的单个数据库类,例如查询构建、行计数返回、插入 ID 等。
  • 一个接口数据类,以确保每个类保持一致(例如,每个类必须具有所有四个CRUD操作)

数据库类

我的数据库类通常如下所示。您会注意到底部有您指定的突变函数。这些专门设计用于从类本身设置获取数据。有少量验证(if(is_resource(...))在 get_connection 中),尽管我听说这种代码应该在模型级别。

    public $error;

    private $location = '';
    private $username = '';
    private $password = '';
    private $database = '';

    public function __construct()
    {
        $connection = mysql_connect($this->location,$this->username,$this->password);

        $this->set_connection($connection);

        $db_select = mysql_select_db($this->database,$this->get_connection());
    }

    public function query()
    {
        $query = mysql_query($this->query,$this->connection);

        $this->set_insert_id(mysql_insert_id($this->connection));

        switch(substr(strtolower($this->query),0,6))
        {
            case 'select':
                $this->set_row_count(mysql_num_rows($query));

                $row_count = $this->get_row_count();

                if($row_count == 0)
                {
                    $this->set_results(0);
                }
                else
                {
                    while($result = mysql_fetch_assoc($query))
                    {
                        $results = $this->get_results();
                        $results[] = $result;
                        $this->set_results($results);
                    }
                }
            break;
            case 'insert':
            case 'update':
            case 'delete':
            case 'replace':
            default:
                $this->set_results(($query === true));
            break;
        }
    }

    public function get_query()
    {
        return $this->query;
    }

    public function set_query($query)
    {
        $this->query = $query;
    }

    public function get_insert_id()
    {
        return $this->insert_id;
    }

    public function set_insert_id($insert_id)
    {
        if(is_numeric($insert_id))
        {
            $this->insert_id = $insert_id;
        }
    }

    public function get_results()
    {
        return $this->results;
    }

    public function set_results($results)
    {
        $this->results = $results;
    }

    public function get_row_count()
    {
        return $this->row_count;
    }

    public function set_row_count($row_count)
    {
        if(is_numeric($row_count))
        {
            $this->row_count = $row_count;
        }
    }

    public function get_connection()
    {
        return $this->connection;
    }

    public function set_connection($connection)
    {
        if(is_resource($connection))
        {
            $this->connection = $connection;
        }
        else
        {
            $this->connection = false;
        }
    }
}
?>

数据类

接口数据类只是其他类的指南,因此非常简单。使用这种方法时,很容易使用您的数据进行操作。

<?php
interface Data {
    public function create();
    public function read();
    public function update();
    public function delete();
}
?>

一个示例类

这是一个示例类,我通常会与前面提到的操作数据库和数据类的类一起使用。使用典型的 CRUD 操作时,我调用 Database 类,设置查询,查询数据库,然后返回结果。这很简单,任何其他进一步的要求都可以附加到每个函数中。

<?php
require_once('classes/class.Data.php');
require_once('classes/class.Database.php');
class Settings implements Data {
    private $profile_id;
    private $settings = array();

    public function create()
    {
        $settings_instance = new Database;
        $sql = 'INSERT INTO settings (' . implode(',',array_keys($this->settings)) . ') VALUES ("' . implode('","',array_values($this->settings)) . '");';
        $settings_instance->set_query($sql);
        $settings_instance->query();
        return $settings_instance->get_results();
    }

    public function read()
    {
        $settings_instance = new Database;
        $sql = 'SELECT * FROM settings WHERE profile_id = "' . $this->profile_id . '"';
        $settings_instance->set_query($sql);
        $settings_instance->query();

        $settings_results = $settings_instance->get_results();

        if($settings_results)
        {
            $this->set_settings($settings_results[0]);
        }
    }

    public function update()
    {
        $keys = array_keys($this->settings);
        $values = array_values($this->settings);
        $settings_instance = new Database;
        $sql = 'UPDATE settings SET ';
        foreach($keys as $index => $key)
        {
            if($keys[$index] == "profile_id")
                continue;
            $sql .= $keys[$index] . ' = "' . $values[$index] . '", ';
        }
        $sql = rtrim($sql,', ');
        $sql .= ' WHERE profile_id = "' . $this->profile_id . '"';
        $settings_instance->set_query($sql);
        $settings_instance->query();
        return $settings_instance->get_results();
    }

    public function delete()
    {
        $settings_instance = new Database;
        $sql = 'DELETE FROM settings WHERE profile_id = "' . $this->profile_id . '"';
        $settings_instance->set_query($sql);
        $settings_instance->query();
        return $settings_instance->get_results();
    }

    public function get_profile_id()
    {
        return $this->profile_id;
    }

    public function set_profile_id($profile_id)
    {
        if(is_numeric($profile_id))
        {
            $this->profile_id = $profile_id;
        }
    }

    public function get_setting($index)
    {
        if(isset($this->settings[$index]))
        {
            return $this->settings[$index];
        }
    }

    public function set_setting($index,$new_value)
    {
        if(isset($this->settings[$index]))
        {
            $this->settings[$index] = $new_value;
        }
    }

    public function get_settings()
    {
        return $this->settings;
    }

    public function set_settings($settings)
    {
        if(is_array($settings))
        {
            $this->settings = $settings;
        }
    }

    public function get_setting_types()
    {
        return $this->setting_types;
    }

    public function set_setting_types($setting_types)
    {
        if(is_array($setting_types))
        {
            $this->setting_types = $setting_types;
        }
    }
}
?>

一些示例代码

这是一些与此方法一起使用的示例模型代码。我觉得这很有可读性。它将在数据库中创建一个 profile_id = 1 的新设置行。

require_once('class.Settings.php');
$Settings = new Settings;
$Settings->set_profile_id(1);
$Settings->create();
于 2012-06-20T12:49:54.890 回答