2011-04-01 5 views
0

Dependency InjectionFactory 클래스를 사용하려고합니다. 나는 이것을 아주 많이 읽었고 많은 예제를 보았습니다. .. 그러나 나는 (그 이잖아요에 대한 공장 에선 클래스의 제대로 DI를 사용하고 생각하지 않는다공장 및 종속성 인젝션 도움이 필요하십니까

내 데이터베이스를 조회 할 수 아니에요 나는 오류 얻을 :.
Fatal error: Call to undefined method Conn::query()

문제는 getRows($sql) 기능에.

내가 제대로 DI를 사용할 수 없었습니다 그것은 PDO 기능을 사용할 수없는 것 같다.

사람이 올바른 방향으로 날 지점 어쩌면 내가 뭘하는지 볼 수 틀렸어?

이것은 지금까지 제 코드입니다. 사용자 클래스 나던 생성자 PHP를 가지고 있기 때문에 당신은 당신의 사용자 생성자 연결 및 ID

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

을 전달하는

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

답변

0

Conn 개체에 query 기능을 실행하려고 생성자, 그냥 발생하지 않습니다. 생성자는 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

:

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

그리고 여기에 다른 모든 클래스입니다 기본 클래스의 생성자를 발생시킵니다.

function UserDAO (&$db, &$id = NULL) { 
    $this->db = &$db; 
    $this->id = &$id;; 
    } 
그것의 DB를 객체

을하고자 할 때

그래서 기본적으로 당신은 UserDAO에게 연결 개체를 전달하는 이유는 당신은 당신의 Conn에서 개체를 반환하려는

+0

나는 이해합니다. DB 객체를 가져 오려면 어떻게해야합니까? UserDAO 클래스에서'__constructor'를 사용해야합니까? – Steven

+1

@Steven, 당신이 생성자로'__construct()'메소드를 사용하는 것이 좋습니다. 왜냐하면 생성자를보다 분명하게 만듭니다 (클래스의 이름을 잊어 버렸고 생성자임을 쉽게 알지 못합니다). 나중에 클래스 이름을 변경하면 변경되는 코드 줄이 줄어 듭니다. – Nick

관련 문제