管理员和用户的不同类型的对象

时间:2015-10-29 14:43:26

标签: php oop

我正在构建一个Intranet应用程序,我希望能够为常规用户和管理员用户提供2种不同类型的用户。我想弄清楚这样做的最佳方法是什么。要么有一个对象用于管理类型的东西,要么有一个对象用于用户类型的东西。或者将它们组合成一个对象。但是我一直陷入困境,不知道如何去做,或者这是最好的方式。

假设我有以下情况:

1. query the db to get all tasks for all projects that are active.
    Admin Query
2. query the db to get all tasks for all projects that are due today and active.
    Admin Query
3. Query the db to get all tasks for a specific project that are active.
    Admin Query
    User Query
4. Query the db to get all tasks for a specific project that are active and due today.
    Admin Query
    User Query
5. Query the db to get all tasks for a specific project.
    Admin Query
    User Query
6. Query the db to get all tasks for a specific project, with different status specified.
    Admin Query
7. Any one of those queries has an optional parameter to either get the count or the data.

我启动了以下对象,但现在我有点卡住了哪条路线:

public function getTasks($status, $project, $type = "count", $duetoday = NULL)
    {
        try
        {
            if($duetoday != NULL){
                $today = date("Y-m-d"); 
                $stmt = $this->db->prepare("SELECT * FROM tasks WHERE status=:status
                                            AND $project=:project AND duedate BETWEEN :duedate 
                                            AND :duedate");
                $stmt->execute(array(':status'=>$status,':project'=>$project,':duedate'=>$today));
            }else{
                $stmt = $this->db->prepare("SELECT * FROM tasks WHERE status=:status
                                            AND $project=:project");
                $stmt->execute(array(':status'=>$status,':project'=>$project)); 
            }

            $tasks=$stmt->fetch(PDO::FETCH_ASSOC);

            if($stmt->rowCount() > 0)
            {
                if($type == "count"){
                    return $stmt->rowCount();
                }else{
                    return $tasks;
                }
            }else{
                return false;   
            }
        }
        catch(PDOException $e)
        {
            echo $e->getMessage();
        }
    }

1 个答案:

答案 0 :(得分:1)

我将从关于single responsibility principle的一些话开始。基本上,这意味着一个对象及其行为应该有一个责任。在这里,我认为你的getTasks方法是将一些代码重构为更好的面向对象代码的好机会。

它实际上有很多事情要做:

  • 生成sql
  • 执行查询
  • 控制程序流程

生成sql的方法不应该担心它的执行,执行它的方法不应该担心它的执行。作为副作用,这也将减少单个方法中的嵌套。

要编写很多代码,我会让你这样做,但是如果你创建实现这些接口的类和一个使用它们的控制器,你应该能够通过这个来编写更容易维护/重构代码:

interface SqlGenerating {
    /**
     * @param array $params
     * @return string
     */
    public function makeSql(array $params);

    /**
     * @param array $params
     * @return array
     */
    public function makeValues(array $params);
}

interface DBAccessing {
    public function __construct(\PDO $pdo);

    /**
     * @param string $sql
     * @param array $values
     * @return PDOStatement
     */
    public function getStmt($sql, array $values = []);
}

class Controller {
    public function __construct(SqlGenerating $sqlGenerator, DBAccessing $dbAccess) {
        // associate to private properties
    }
    public function getTasks($status, $project, $type = "count", $duetoday = null) {
        // this function will use the sqlGenerator and the dbAccess to query the db
        // this function knows to return the count or the actual rows
    }
}

如果您还没有,那么现在是了解函数中类型提示的好时机。这需要将函数传递给对象(或数组)以确保函数的行为。此外,您会注意到我在控制器中键入了 interfaces 。这实际上是能够切换类,如果你需要一个不同的类来管理sql和db访问。