2016-03-18 10 views
0

Şu anda FlightPHP çerçevesiyle bir uygulama geliştiriyorum ve FlightPHP'yi özel sınıfıma nasıl enjekte edebileceğimi merak ediyorum, böylece bağımlılık kabına enjekte ettiğim belirli sınıfları kullanabiliyorum. Daha önce Uçuş bağımlılık kabın içine enjekte edilmiş günlük işlevini kullanmak mümkün olacak şekildeÇerçeve özel sınıflara nasıl enjekte edilir?

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; 
}); 

benim veritabanı sınıfı yapıcı içine Flight enjekte çalışılıyor.

"Logger", "Flight::log()->function("test");" Flight örneğinde kullanıldığında index.php dosyasında çalışır, ancak başka bir alanda (Veritabanı sınıfı içinde) kullanmayı denediğimde, kullanmama izin vermez "Uçuş" kapsamında.

Güncelleme: Doğru kullanım

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(); 

mi?

+0

http://flightphp.com/learn Yani DB oluşturucu içinde enjekte/Flight örneğini almak mümkün olmadığını söylüyorsunuz? Bunların altında ne saklıyor? – chba

+0

Özel sınıfımın (DB), Uçuş bağımlılığı kabına enjekte ettiğim diğer sınıfları kullanabilmesi için, Uçuşun DB yapıcısına nasıl iletileceğinden emin değilim. – mhvvzmak1

cevap

0

\Flight\Engine örneğini, DB denetleyicisindeki çerçeve örneğini iletmek için register yönteminde üçüncü parametre dizisine geçiş yapabilirsiniz. \Flight\Engine arayüzü kullanarak kodunuzu framework uygulaması ile birleştiriyorsunuz sanırım. Bu durumda çerçeve örneği almak için her yerde Flight::app()'u kullanabilirsiniz.

Bu, Uçuşun Bağımlı Enjeksiyon Kabı gibi bir konsepti olmadığı anlaşılıyor. Parametre değerlerinizi açıkça belirtmeniz gerekir.

Güncelleme: Monolog\Logger yapıcısı içine bu ['app'] sen enjekte edilir dize yaparak

. Bu satır return $log->pushHandler(new StreamHandler('app.log')); hata vermelidir.

daha dikkatli oku

+0

Sanırım bu doğru izler üzerinde başarmaya çalışıyorum, bunu biraz ve türden bir şekilde ayarlıyorum, ancak yapıcı ve kayıt dizisinde doğru şekilde yapıp yapmadığımdan emin değilim, versiyonumu ana gönderiye ekledim . – mhvvzmak1

+0

Cevabımı güncelledim. Tamam görünüyor, ancak Logger'ın bu dizeye gerçekten ihtiyacı var mı? – chba

+0

Evet Logger, geçerli günlük kayıt profilinin adı olan yapıcısında bir argüman gerektirir. – mhvvzmak1