2016-08-30 4 views
1

これはInject Silex $app in my custom classなどの複製のように見えますが、私はそれを解決することができませんでした。

私はこのように私のサービスを定義します。

$app['user.repo'] = function() { 
    return new MyApp\Repository\User(); 
}; 

私のクラスには、次のようになります。

<?php 
namespace MyApp\Repository; 
use Silex\Application; 

class User { 
    public function findAll(Application $app) { 
     $users = $app['db']->fetchAll('SELECT * FROM user'); 
     return $users; 
    } 
} 

そして、私はこのようなサービスを使用します。

$users = $app['user.repo']->findAll($app); 

私はどのように行うことができます私のすべての方法に$appを入れないでこの同じことは?

答えて

5

なぜ注射しないのですか?

$app['user.repo'] = function() use ($app) { 
    return new MyApp\Repository\User($app); 
}; 

そして、ここで変更したクラスです。

<?php 

namespace MyApp\Repository; 
use Silex\Application; 

class User { 
    /** @var Application */ 
    protected $app; 

    public function __construct(Application $app) { 
     $this->app = $app; 
    } 

    public function findAll() { 
     $users = $app['db']->fetchAll('SELECT * FROM user'); 

     return $users; 
    } 
} 

あるいはさらに良い:代わりに、アプリケーション全体を注入する(したがって、あなたの本当の依存関係を隠し、痛みのテストユニットを作る)の、だけは本当に何を注入は、必要があります。

$app['user.repo'] = function() use ($app) { 
    return new MyApp\Repository\User($app["db"]); 
}; 

この方法は、あなたのクラスは、次のようになります。

<?php 

namespace MyApp\Repository; 
use Silex\Application; 

class User { 
    protected $db; 

    public function __construct($db) { 
     $this->db = $db; 
    } 

    public function findAll() { 
     $users = $this->db->fetchAll('SELECT * FROM user'); 

     return $users; 
    } 
} 
+0

ありがとうございます。私が注射を試みる前に、まったく同じ正確な解決策を使用しました...クラスと基本的なPHPの理解が不足しています。私は '$ this-> db-> fetchAll(...)'の代わりに '$ db-> fetchAll(..)'を持っていました。 – Travis

関連する問題