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

我正在尝试将 Flight 注入到我的数据库类构造函数中,以便能够使用之前注入到 Flight 依赖容器中的 log 函数。

当在 Flight 实例“”下使用时,“Logger”在 index.php 中有效Flight::log()->function("test");,但是当我尝试在另一个范围内(在 Database 类中)使用它时,它不允许我在“”的上下文中使用它航班”。

更新:

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

使用正确吗?

4

1 回答 1

0

您可以\Flight\Engine在方法的第三个参数数组中register传递实例以在数据库控制器中传递框架实例。\Flight\Engine不使用接口 sou 我猜你是在将你的代码与框架实现耦合起来。在这种情况下,您可以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没有依赖注入容器这样的概念。您必须明确指定参数值。

更新:

通过这样做,['app']您将字符串注入Monolog\Logger. 此行return $log->pushHandler(new StreamHandler('app.log'));应引发错误。

仔细阅读http://flightphp.com/learn

于 2016-03-19T06:28:17.580 回答