Нужна помощь с заводской и зависимой инъекцией - PullRequest
0 голосов
/ 01 апреля 2011

Я пытаюсь использовать Dependency Injection и Factory класс. Я много читал об этом и видел много примеров. Но я не думаю, что правильно использую DI (из класса Facotry для этого материала.

Я не могу запросить свою базу данных. Я получаю ошибку:
Fatal error: Call to undefined method Conn::query().

Проблема в функции getRows($sql).

Кажется, я не смог правильно использовать DI, и он не может использовать PDO функции.

Может ли кто-нибудь указать мне правильное направление и, возможно, увидеть, что я делаю не так?

Пока это мой код.

$user = Factory::createUser();
$result = $user->getUsers();
print_r($result);

А вот и все остальные классы:

class Factory {
  // I think I'm using Dependency Injection here
  function createUser($id = NULL) { return new User(new Conn(), $id); }
}

//Returns PDO conection and that's it.
class Conn {

  function config($cfg_file = 'sl.config') {   
    /* The code here returns $conf array */
  }

  function Conn() {
    $conf = $this->config();
    try { return new PDO($conf['dsn'], $conf['user'], $conf['pass']); } 
    catch (PDOException $e) { echo $e->getMessage(); }
    }  
}

interface iUser {
    public function getSomething();
}

// This is where I do all my SQL queries and return results.
class UserDAO {
  private $db = NULL;
  private $id;

  function UserDAO (&$db, &$id = NULL) {
    $this->db = &$db;
    $this->id = &$id;;
  }  

  public function getRows($sql)
  {
    $result = $this->db->query($sql); // <------- THIS IS NOT WORKING
    $row = $result->fetch(PDO::FETCH_ASSOC);    
    return $row;            
  }

  function getUsers($limit = 10) {
    $sql ="SELECT * FROM users LIMIT $limit";
    return $this->getRows($sql);
  }
}


class User extends UserDAO implements iUser {

  public function getSomething() {
    echo "Something";
  }      
}

Ответы [ 2 ]

0 голосов
/ 01 апреля 2011

Вы пытаетесь вернуть объект в конструкторе Conn, чего просто не происходит. Конструкторы возвращают void. Добавьте другой метод, например, метод getDatabaseObject, который я добавил ниже, чтобы вернуть ваш объект PDO.

class Conn {
    function Conn() {
        $conf = $this->config();
    }

    public function getDatabaseObject() {
        try { return new PDO($conf['dsn'], $conf['user'], $conf['pass']); } 
        catch (PDOException $e) { echo $e->getMessage(); }
    }
}

class Factory {
    // I think I'm using Dependency Injection here
    function createUser($id = NULL) {
        $c = new Conn();
        return new User($c->getDatabaseObject(), $id);
    }
}
0 голосов
/ 01 апреля 2011

Вы передаете своему конструктору пользователя соединение и идентификатор

return new User(new Conn(), $id);

Поскольку у класса User нет конструктора, php запускает конструктор базового класса

function UserDAO (&$db, &$id = NULL) {
    $this->db = &$db;
    $this->id = &$id;;
  }

То есть, по сути, вы передаете UserDAO объект соединения, когда ему нужен объект db

Вот почему он пытается запустить функцию query на Conn объекте

...