2016-07-08 6 views
1

私はPHPで複数のコンストラクタを持つことはできません、と私ができる、ので、私は、依存関係のコンテナ内のユーザモデルを保存カント私は残りのAPIを構築するためにスリム3を使用しています、と私は、この構造スリム3の別クラスから依存関係コンテナにアクセスする方法は?

# 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->(「/見つける-ユーザーごとのユーザー名/ {$ユーザー名}」を取得、機能($ 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 
    } 
} 
関連する問題