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

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

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

1 ответ

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

Другие вопросы по тегам