Как внедрить рамки в пользовательский класс?

В настоящее время я разрабатываю приложение с платформой 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();

Это правильное использование?

0

Решение

Вы могли бы передать экземпляр \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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]