2016-03-18 7 views
0

私はFlightPHPフレームワークを使ってアプリケーションを開発しています。私は自分のカスタムクラスにFlightPHPを注入して、自分が依存性コンテナに注入した特定のクラスを使用できるようにする方法が不思議です。フレームワークをカスタムクラスに挿入するには?

use Flight; 
use Logger; 

class DB{ 

    public function __construct(...){ 

     $this->app = $app; // Flight:: instance 

    } 

    public function doStuff($stuff){ 

     return $this->app->log()->function($stuff); 

    } 

} 

Flight::register('log', 'Logger', ['app'], function($log) { 
    return $log->pushHandler(new StreamHandler('app.log')); 
}); 

Flight::register('database', 'DB', array($data), function($db) { 
    return $db; 
}); 

私は以前フライト依存容器に注入したログ機能を使用することができていますように、私のデータベースクラスのコンストラクタにフライトを注入しようとしています。

"Logger"はFlightインスタンス "Flight::log()->function("test");"で使用するとindex.phpで動作しますが、別のスコープ(データベースクラス内)で使用しようとすると使用できません「フライト」の文脈で

更新:

Flight::register('log', 'Monolog\Logger', ['app'], function($log) { 
    return $log->pushHandler(new StreamHandler('app.log')); 
}); 

class DB{ 
    function __construct(Monolog\Logger $engine){ 

     #var_dump($engine); 
     $engine->addInfo("injected"); // works 

    } 
} 

Flight::register('database', 'DB', array(Flight::log()), function($db) { 
    return $db; 
}); 
Flight::database(); 

が正しい使い方ですか?

+0

だからあなたはあなたがDBのコンストラクタでフライトのインスタンスを注入/受信できないことを言っていますか?それらの下に何が隠れていますか? – chba

+0

FlightをDBコンストラクタに渡す方法がわかりません。そのため、私のカスタムクラス(DB)がFlightの依存関係コンテナに注入した他のクラスを利用できるようになります。 – mhvvzmak1

答えて

0

registerメソッドの3番目のパラメータの配列に\Flight\Engineのインスタンスを渡して、DBコントローラにフレームワークインスタンスを渡すことができます。 \Flight\Engineあなたは私が推測するフレームワークの実装とあなたのコードを結合しているインターフェイスを使用していません。この場合、Flight::app()をどこでも使用してフレームワークインスタンスを取得できます。

<?php error_reporting(E_ALL); 
require 'vendor/autoload.php'; 


class DB 
{ 
    function __construct(\Flight\Engine $engine) 
    { 
     var_dump($engine->get('connectionString')); 
    } 
} 

Flight::set('connectionString', 'mssql'); 
Flight::register('database', 'DB', array(Flight::app()), function($db) { 
    return $db; 
}); 

Flight::database(); 

Flightには依存性注入コンテナという概念はありません。パラメータ値を明示的に指定する必要があります。

更新:

あなたがMonolog\Loggerのコンストラクタに文字列を注入している['app']これにより。この行return $log->pushHandler(new StreamHandler('app.log'));はエラーを起こすはずです。

読むより慎重http://flightphp.com/learn

+0

これは私が達成しようとしている正しいトラックにあると思いますが、これをちょっとしたもので調整しましたが、コンストラクタとレジスタ配列で正しく行っているかどうかは分かりません。 。 – mhvvzmak1

+0

答えを更新しました。外見は大丈夫ですが、Loggerにはこの文字列 'app'が本当に必要ですか? – chba

+0

ありLoggerは現在のロギングプロファイルの名前であるコンストラクタに1つの引数を必要とします。 – mhvvzmak1

関連する問題