Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将框架注入自定义类?_Php_Rest_Registry_Flightphp - Fatal编程技术网

Php 如何将框架注入自定义类?

Php 如何将框架注入自定义类?,php,rest,registry,flightphp,Php,Rest,Registry,Flightphp,我目前正在用FlightPHP框架开发一个应用程序,想知道如何将FlightPHP注入到自定义类中,以便能够使用注入到其依赖项容器中的特定类 use Flight; use Logger; class DB{ public function __construct(...){ $this->app = $app; // Flight:: instance } public function doStuff($stuff){

我目前正在用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实例“
Flight::log()->函数(“test”);
”下使用时,“Logger”在index.php中工作,但是当我尝试在另一个作用域(数据库类内)中使用它时,它不允许我在“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();

用法是否正确?

您可以在
register
方法的第三个参数数组中传递
\Flight\Engine
的实例,以传递数据库控制器中的框架实例<代码>\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();

那么您是说您无法在DB构造函数中接收/注入Flight实例?那些……下面藏着什么?我不确定如何将Flight传递到DB构造函数中,以便我的自定义类(DB)能够利用我注入Flight依赖项容器中的其他类。我想这是我试图实现的正确方向,对此做了一些调整,但不确定我在构造函数和寄存器数组中是否正确,我在主帖子中添加了我的版本。我更新了我的答案。看起来没问题,但Logger真的需要这个字符串“app”吗?是的,Logger需要在其构造函数中包含一个参数,即当前日志配置文件的名称。