Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.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 使用Restler 3'时,将参数值传递到_construct();s依赖项注入容器作用域_Php_Dependency Injection_Restler - Fatal编程技术网

Php 使用Restler 3'时,将参数值传递到_construct();s依赖项注入容器作用域

Php 使用Restler 3'时,将参数值传递到_construct();s依赖项注入容器作用域,php,dependency-injection,restler,Php,Dependency Injection,Restler,我有一个应用程序,它使用DICPimple来管理依赖注入;这在通过命令行或内部调用某些方法时非常有效。但是,一旦我尝试通过Restler提供的API调用它们,它就会抛出500个错误,因为没有为_construct()提供所需的参数。(请注意,类中没有_construct()或不需要构造函数参数的方法可以通过API正常工作。) 我正在尝试使用Restler的内部DIC,称为Scope,但实际上效果不太好。举个例子,我在index.php中得到了如下内容: Scope::register('Kios

我有一个应用程序,它使用DICPimple来管理依赖注入;这在通过命令行或内部调用某些方法时非常有效。但是,一旦我尝试通过Restler提供的API调用它们,它就会抛出500个错误,因为没有为_construct()提供所需的参数。(请注意,类中没有_construct()或不需要构造函数参数的方法可以通过API正常工作。)

我正在尝试使用Restler的内部DIC,称为Scope,但实际上效果不太好。举个例子,我在index.php中得到了如下内容:

Scope::register('Kiosk\\Drone\\Drone', function () { 
    return new Kiosk\Drone\Drone(Scope::get('\\Noodlehaus\\Config')); 
}); 
<?php

namespace Kiosk;

use Luracast\Restler\Scope;
use Luracast\Restler\Restler;

require_once __DIR__.'/vendor/autoload.php';

$file = __DIR__ . "/config.json";

$main = new Main($file);

$c = $main->c;
Scope::$resolver = function ($className) use ($c) { 
    return $c[$className];
};

$r = new Restler(true,true);
$r->addAPIClass('Luracast\\Restler\\Resources');
$r->addAPIClass('Kiosk\\Drone\\Drone','drone');
$r->handle();

?>
<?php

use Luracast\Restler\Scope;
use Luracast\Restler\Restler;
use Kiosk\Main;
use Kiosk\Drone\Drone;

require_once __DIR__.'/vendor/autoload.php';

$file = __DIR__ . "/config.json";

$main = new Main($file);

$c = $main->c;

Scope::register('Kiosk\\Drone\\Drone', function () use ($c) {
    return new DataTable($c->get('config'), $c->get('logger'));
});

$r = new Restler();
$r->addAPIClass('Luracast\\Restler\\Resources');
$r->addAPIClass('Kiosk\\Drone\\Drone','drone');
$r->addAuthenticationClass('Kiosk\\System\\TokenAuth');
$r->handle();

?>
问题是\Noodlehaus\Config在实例化时需要指向JSON编码的配置文件的路径。在我的应用程序中,这已在Pimple中处理

当使用我的主加载器对象(它实例化Pimple并用所需的依赖项填充容器)时,我能够通过CLI直接调用相同的方法,而不会出现以下问题:

$file = __DIR__ . "/config.json";
$main = new Main($file);
$d = new Kiosk\Drone\Drone($main->c['config']);
我想这方面的功能在范围内,但没有一个示例或一些文档,我无法理解它。坦率地说,我想将作用域的使用限制在尽可能少的范围内,因为它是建立在单例模式的基础上的,这有点挫败了首先使用依赖注入的整个想法

实际上,我希望能够让Restler访问类中的方法,并使用Pimple实例化它们。这将是一个积分

编辑:

我已被要求在Restler中支持外部依赖注入容器。作者已经在即将到来的RC6中实现了它

不过,我不能说我对使用它有完全的把握。下面是一个例子

作者表示,外部DIC的使用方式如下:

Scope::$resolver = function ($className) use ($context) {
    return $context->getByType($className);
};
我快到了,它快开始工作了。我相信现在的问题与我的DIC未加载的Restler依赖项有关。如前所述,我正在使用依赖注入容器Pimple。我有一个名为Main的初始化类,在该类中我实例化了Pimple、设置依赖项、加载配置文件等

下面是Main.php的相关部分:

class Main {

    private $configFile;
    public $c; // a dependency injection container

    public function __construct($configFile=null){
        $this->configFile = $configFile;
        //create DIC
        $this->c = new Container();

        ...
        }
    ...
    }
这是我的index.php:

Scope::register('Kiosk\\Drone\\Drone', function () { 
    return new Kiosk\Drone\Drone(Scope::get('\\Noodlehaus\\Config')); 
}); 
<?php

namespace Kiosk;

use Luracast\Restler\Scope;
use Luracast\Restler\Restler;

require_once __DIR__.'/vendor/autoload.php';

$file = __DIR__ . "/config.json";

$main = new Main($file);

$c = $main->c;
Scope::$resolver = function ($className) use ($c) { 
    return $c[$className];
};

$r = new Restler(true,true);
$r->addAPIClass('Luracast\\Restler\\Resources');
$r->addAPIClass('Kiosk\\Drone\\Drone','drone');
$r->handle();

?>
<?php

use Luracast\Restler\Scope;
use Luracast\Restler\Restler;
use Kiosk\Main;
use Kiosk\Drone\Drone;

require_once __DIR__.'/vendor/autoload.php';

$file = __DIR__ . "/config.json";

$main = new Main($file);

$c = $main->c;

Scope::register('Kiosk\\Drone\\Drone', function () use ($c) {
    return new DataTable($c->get('config'), $c->get('logger'));
});

$r = new Restler();
$r->addAPIClass('Luracast\\Restler\\Resources');
$r->addAPIClass('Kiosk\\Drone\\Drone','drone');
$r->addAuthenticationClass('Kiosk\\System\\TokenAuth');
$r->handle();

?>
感谢您提供的任何帮助

编辑2:

这个问题似乎比简单地在Pimple中没有依赖关系更为严重。我怀疑问题与DIC的结构不同有关:

PHP Fatal error:  Uncaught exception 'InvalidArgumentException' with     message 'Identifier "Luracast\Restler\Format\JsonFormat" is not defined.'     in         /var/www/public_html/api/vendor/pimple/pimple/src/Pimple/Container.php:95
Stack trace:
#0 /var/www/public_html/api/index.php(17): Pimple\Container-        >offsetGet('Luracast\\Restle...')
#1  /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/S cope.php(108): Kiosk\{closure}('Luracast\\Restle...')
#2  /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Restler.php(389): Luracast\Restler\Scope::get('JsonFormat')
#3 /var/www/public_html/api/index.php(21): Luracast\Restler\Restler->setSupportedFormats('JsonFormat')
#4 {main}
thrown in /var/www/public_html/api/vendor/pimple/pimple/src/Pimple/Container.php on line 95
编辑3:这些是实施Luracast建议后出现的新错误:

[$] PHP Warning:  PDO::__construct() expects at least 1 parameter, 0 given in /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Resources.php on line 711
[$] PHP Stack trace:
[$] PHP   1. {main}() /var/www/public_html/api/index.php:0
[$] PHP   2. Luracast\Restler\Restler->handle() /var/www/public_html/api/index.php:27
[$] PHP   3. Luracast\Restler\Restler->call() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Restler.php:304
[$] PHP   4. call_user_func_array:{/var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Restler.php:1045}() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Restler.php:1045
[$] PHP   5. Luracast\Restler\Resources->get() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Restler.php:1045
[$] PHP   6. Luracast\Restler\Resources->_parameter() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Resources.php:327
[$] PHP   7. Luracast\Restler\Resources->_model() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Resources.php:553
[$] PHP   8. PDO->__construct() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Resources.php:711
[$] PHP Warning:  get_object_vars() expects parameter 1 to be object, null given in /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Resources.php on line 713
[$] PHP Stack trace:
[$] PHP   1. {main}() /var/www/public_html/api/index.php:0
[$] PHP   2. Luracast\Restler\Restler->handle() /var/www/public_html/api/index.php:27
[$] PHP   3. Luracast\Restler\Restler->call() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Restler.php:304
[$] PHP   4. call_user_func_array:{/var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Restler.php:1045}() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Restler.php:1045
[$] PHP   5. Luracast\Restler\Resources->get() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Restler.php:1045
[$] PHP   6. Luracast\Restler\Resources->_parameter() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Resources.php:327
[$] PHP   7. Luracast\Restler\Resources->_model() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Resources.php:553
[$] PHP   8. get_object_vars() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Resources.php:713
[$] PHP Warning:  Invalid argument supplied for foreach() in /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Resources.php on line 715
[$] PHP Stack trace:
[$] PHP   1. {main}() /var/www/public_html/api/index.php:0
[$] PHP   2. Luracast\Restler\Restler->handle() /var/www/public_html/api/index.php:27
[$] PHP   3. Luracast\Restler\Restler->call() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Restler.php:304
[$] PHP   4. call_user_func_array:{/var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Restler.php:1045}() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Restler.php:1045
[$] PHP   5. Luracast\Restler\Resources->get() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Restler.php:1045
[$] PHP   6. Luracast\Restler\Resources->_parameter() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Resources.php:327
[$] PHP   7. Luracast\Restler\Resources->_model() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Resources.php:553

可能值得注意的是,我实现了一个不同的依赖注入容器,一个名为PHP-DI。这一个的语法更接近于Scope,因此我认为使用Restler会更简单。然而,我得到的错误与它们完全相同。

让我尝试找到一个更简单的解决方案

<?php

use Luracast\Restler\Scope;
use Luracast\Restler\Restler;

require_once __DIR__.'/vendor/autoload.php';

$file = __DIR__ . "/config.json";

$main = new Main($file);

$c = $main->c;

Scope::register('Kiosk\\Drone\\Drone', function () use ($c) { 
    return $c['Kiosk\Drone\Drone']; 
}); 

$r = new Restler(true,true);
$r->addAPIClass('Luracast\\Restler\\Resources');
$r->addAPIClass('Kiosk\\Drone\\Drone');
$r->handle();

多亏了Luracast,我现在有了解决方案!幸运的是,RestlerRC6PHP-DI一旦正确集成,就完全兼容了。毫不奇怪,问题是我自己造成的

这完全是名称空间的问题。我最初在index.php的开头定义了名称空间Kiosk。Luracast建议将其保留在根命名空间中

这是当前的working index.php:

Scope::register('Kiosk\\Drone\\Drone', function () { 
    return new Kiosk\Drone\Drone(Scope::get('\\Noodlehaus\\Config')); 
}); 
<?php

namespace Kiosk;

use Luracast\Restler\Scope;
use Luracast\Restler\Restler;

require_once __DIR__.'/vendor/autoload.php';

$file = __DIR__ . "/config.json";

$main = new Main($file);

$c = $main->c;
Scope::$resolver = function ($className) use ($c) { 
    return $c[$className];
};

$r = new Restler(true,true);
$r->addAPIClass('Luracast\\Restler\\Resources');
$r->addAPIClass('Kiosk\\Drone\\Drone','drone');
$r->handle();

?>
<?php

use Luracast\Restler\Scope;
use Luracast\Restler\Restler;
use Kiosk\Main;
use Kiosk\Drone\Drone;

require_once __DIR__.'/vendor/autoload.php';

$file = __DIR__ . "/config.json";

$main = new Main($file);

$c = $main->c;

Scope::register('Kiosk\\Drone\\Drone', function () use ($c) {
    return new DataTable($c->get('config'), $c->get('logger'));
});

$r = new Restler();
$r->addAPIClass('Luracast\\Restler\\Resources');
$r->addAPIClass('Kiosk\\Drone\\Drone','drone');
$r->addAuthenticationClass('Kiosk\\System\\TokenAuth');
$r->handle();

?>

谢谢您的建议。不幸的是,我在这方面仍然有困难。我的index.php文件看起来很像你建议的,但是现在它抛出了很多错误。。。所有这些似乎都与无法将参数传递到依赖项有关。我已经编辑了我的原始问题以包含错误日志。