2016-07-08 2 views
1

나는 휴식 API를 구축하는 슬림 3을 사용하고, 그리고 난이 구조를슬림 3에서 별도의 클래스에서 종속성 컨테이너에 액세스하는 방법? 내가 PHP에서 여러 생성자를 가질 수 없기 때문에 내가 종속성 컨테이너에서 사용자 모델을 저장하지 못할, 그리고 내가 할 수있는

# models/user.php 

<?php 
class User { 

    public $id; 
    public $username; 
    public $password; 
    public $number; 
    public $avatar; 

    function __construct($id, $username, $password, $number, $avatar = null, $active = false) { 

     $this -> id = $id; 
     $this -> username = $username; 
     $this -> password = $password; 
     $this -> number = $number; 
     $this -> avatar = $avatar; 
     $this -> active = $active; 

    } 

    static function getByUsername($username) { 

     // i want to access the container right here 

    } 

} 

?> 

이 클래스 인스턴스에서 정적 메서드에 액세스하지 않습니까? 그래서 의존성 컨테이너에 저장할 수없는 서비스에서 컨테이너에 액세스하려면 어떻게해야합니까?

답변

0

당신은 간단하게 다음과 같이 User::getByUsername에 인수로 전달하여 컨테이너에 액세스 할 수 있습니다

$ APP->의 get ('찾기/사용자 별 사용자 이름/{$ 사용자 이름}'기능 ($ request, $ response, $ args) { $ result = \ User :: getByUsername ($ args [ 'username'], $ this-> getContainer()); }});

그러나 응용 프로그램의 아키텍처를 변경하는 것을 고려하십시오. 컨테이너는 당신이 물건을 가지고있는 물건이며, 당신이 그것을 주입하지 않습니다. 왜냐하면 그러한 주입은 컨테이너의 목적을 완전히 제거하기 때문입니다. 당신이 데이터베이스와 같은 저장 장치에서 사용자 인스턴스를 잡아하려는 가정

, 당신은 이런 식으로 그것을 할 수 :

// application level 
$app->get('/find-user-by-username/{$username}', function($request, $response, $args) { 
    // assuming you're using PDO to interact with DB, 
    // you get it from the container 
    $pdoInstance = $this->container()->get('pdo'); 
    // and inject in the method 
    $result = \User::getByUsername($args['username'], $pdoInstance); 
}); 

// business logic level 
class User 
{ 
    public static function getByUsername($username, $dbInstance) 
    { 
     $statement = $dbInstance->query('...'); 
     // fetching result of the statement 
    } 
}