В настоящее время я разрабатываю приложение с платформой 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;
});
Я пытаюсь внедрить Flight в конструктор моего класса базы данных, чтобы я мог использовать функцию log, которая ранее была внедрена в контейнер зависимостей Flight.
«Logger» работает в index.php при использовании под экземпляром Flight »Flight::log()->function("test");
«, однако, когда я пытаюсь использовать его в другой области видимости (в классе Database), это не позволяет мне использовать его в контексте» Flight «.
Обновить:
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();
Это правильное использование?
Вы могли бы передать экземпляр \Flight\Engine
в массиве третьего параметра при register
способ передать экземпляр фреймворка в ваш контроллер БД. \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 нет такого понятия, как Dependency Injection Container. Вы должны указать свои значения параметров явно.
Обновить:
Делая это ['app']
вы вводите строку в конструктор Monolog\Logger
, Эта линия return $log->pushHandler(new StreamHandler('app.log'));
должен поднять ошибку.
Читайте внимательнее http://flightphp.com/learn
Других решений пока нет …