2016-10-28 8 views
1

私はDIに問題があります。それは私には新しいものです。私は私のプロジェクトのクラスでDIとしてコンテナをさせていただきたいと思いますが、私はエラーを得た:スリム3のクラスで依存性注入を受ける

//dependencies.php 
$container = $app->getContainer(); 

$container[Project::class] = function ($c) { 
    return new Project($c); 
}; 
:私のDICの設定ここで

use Slim\Container; 

class Project { 

    protected $ci; 

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

:私はクラスのプロジェクトを作成し

Argument 1 passed to Project::__construct() must be an instance of Slim\Container, none given 

ここで私のコードindex.phpはコードを実行する

// Instantiate the app 
    $settings = require __DIR__ . '/../app/configs/settings.php'; 

    $app = new \Slim\App($settings); 

    // Set up dependencies 
    require __DIR__ . '/../app/configs/dependencies.php'; 
    // Register middleware 
    require __DIR__ . '/../app/configs/middleware.php'; 
    // Register routes 
    require __DIR__ . '/../app/configs/routes.php'; 
    require __DIR__ . '/../app/model/Project.php'; 


    $app->get('/project/{id}', function (Request $request, Response $response) { 
     $project = new Project(); 
     return $response; 
    }); 
    $app->run(); 

私はどこで失敗したのか知りません、スリムなブラジを使ってみましたが、私は同じ結果を得ました。私はまた、代わりに、コンテナの文字列を与えることを試みたが、私はまだヌル取得プロジェクトに渡さ

答えて

0

引数1 :: __構築物()は、スリム\コンテナ、

を与えなしのインスタンスでなければなりません

まあ、確かにコンストラクタに与えられた引数:

:あなたは、コンテナであなたの Projectクラスを登録しているので

$app->get('/project/{id}', function (Request $request, Response $response) { 
    $project = new Project(); // You should pass container instance here, but you don't 
    return $response; 
}); 

、あなたがコンテナからインスタンスを取得することはできません

$app->get('/project/{id}', function (Request $request, Response $response) { 
    $project = $this->container->get('Project'); // Get Project instance from the container, you have already registered it 
    return $response; 
}); 
+0

どちらも機能しています。しかし、私は任意のパラメータを与えたり、コンテナを呼び出すことなく、プロジェクトクラスを呼びたいと思います。 DIを使って、暗黙の呼び出しではないと思いますか? – Nirundthan

+0

「DIC」は「依存性注入コンテナ」を表し、SlimはデフォルトでPimpleを使用します。オブジェクトをコンテナに登録し、必要に応じてそれらを引き出します。 [よりスマートなDICは、それ自体で行うことができます](http://stackoverflow.com/q/40176059/6850820)。 答えは:いいえ、あなたは '' Project'クラスを生成者に渡さずにインスタンス化することはできません。手作業でも '$ container'でも引数を渡す必要があります。 –

+0

この素晴らしい答えをありがとう – Nirundthan