使用 Restler 3 的依赖注入容器 Scope 时将参数值传递到 __construct()
Pass parameter values into __construct() when using Restler 3's dependency injection container Scope
我有一个应用程序使用 DIC Pimple 来管理依赖注入;这在通过命令行或内部调用某些方法时效果很好。但是,一旦我尝试通过 Restler 提供的 API 调用它们,它就会开始抛出 500 个错误,因为没有给出 __construct()所需的参数。 (请注意,class 中没有 __construct() 或不需要构造函数参数的方法通过 API 工作得很好。)
我正在尝试使用 Restler 的 内部 DIC,称为 Scope,但效果不是很好。举个例子,我在 index.php:
中有这样的东西
Scope::register('Kiosk\Drone\Drone', function () {
return new Kiosk\Drone\Drone(Scope::get('\Noodlehaus\Config'));
});
问题是 \Noodlehaus\Config 在实例化时需要 JSON 编码配置文件的路径。在我的应用程序中,这已在 Pimple 中处理。
当使用我的 Main 加载器对象时,它实例化 Pimple 并用所需的依赖项填充容器,我可以调用相同的直接通过 CLI 方法没有任何问题,如下所示:
$file = __DIR__ . "/config.json";
$main = new Main($file);
$d = new Kiosk\Drone\Drone($main->c['config']);
我想在 Scope 中可以实现此功能,但没有示例或某些文档,我无法弄清楚。坦率地说,我想尽可能少地使用 Scope,因为它是建立在单例模式之上的,这有点违背了使用首先是依赖注入。
真的,我希望能够让 Restler 访问我的 classes 中的方法并使用 Pimple[=78 实例化它们=].那将是整合的分数。
编辑:
我被引导到 this bug/feature request 以支持 Restler 中的外部依赖项注入容器。作者已经在即将发布的RC6中实现了
不过我还不能说我完全确定会使用它。显示了一个示例 here in a related bug.
$objectManager = new MyOwnDependencyInjectionContainer();
Scope::$resolver = function ($className) use ($objectManager) {
return $context->get($className);
};
$r->addAPIClass('MyOwnApiClass');
作者说应该这样使用外接DIC:
Scope::$resolver = function ($className) use ($context) {
return $context->getByType($className);
};
我快到了,快工作了。我相信现在的问题与 Restler 依赖项没有被我的 DIC 加载有关。如前所述,我正在使用依赖注入容器 Pimple。我有一个名为 Main 的初始化 class,我在其中实例化 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:
<?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 Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Identifier "Luracast\Restler\Format\JsonFormat" is not defined.' in /var/www/kitchenkiosk.co/public_html/api/vendor/pimple/pimple/src/Pimple/Container.php:95
感谢您提供的任何帮助!
编辑 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,我现在有了解决方案!幸运的是 Restler RC6 PHP-DI 一旦正确集成就可以完美兼容。毫不奇怪,问题是我自己造成的。
这完全是命名空间的问题。我最初在 index.php 的开头定义了命名空间 Kiosk。 Luracast 建议将其保留在根命名空间中。
这是当前工作index.php:
<?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();
?>
我有一个应用程序使用 DIC Pimple 来管理依赖注入;这在通过命令行或内部调用某些方法时效果很好。但是,一旦我尝试通过 Restler 提供的 API 调用它们,它就会开始抛出 500 个错误,因为没有给出 __construct()所需的参数。 (请注意,class 中没有 __construct() 或不需要构造函数参数的方法通过 API 工作得很好。)
我正在尝试使用 Restler 的 内部 DIC,称为 Scope,但效果不是很好。举个例子,我在 index.php:
中有这样的东西Scope::register('Kiosk\Drone\Drone', function () {
return new Kiosk\Drone\Drone(Scope::get('\Noodlehaus\Config'));
});
问题是 \Noodlehaus\Config 在实例化时需要 JSON 编码配置文件的路径。在我的应用程序中,这已在 Pimple 中处理。
当使用我的 Main 加载器对象时,它实例化 Pimple 并用所需的依赖项填充容器,我可以调用相同的直接通过 CLI 方法没有任何问题,如下所示:
$file = __DIR__ . "/config.json";
$main = new Main($file);
$d = new Kiosk\Drone\Drone($main->c['config']);
我想在 Scope 中可以实现此功能,但没有示例或某些文档,我无法弄清楚。坦率地说,我想尽可能少地使用 Scope,因为它是建立在单例模式之上的,这有点违背了使用首先是依赖注入。
真的,我希望能够让 Restler 访问我的 classes 中的方法并使用 Pimple[=78 实例化它们=].那将是整合的分数。
编辑:
我被引导到 this bug/feature request 以支持 Restler 中的外部依赖项注入容器。作者已经在即将发布的RC6中实现了
不过我还不能说我完全确定会使用它。显示了一个示例 here in a related bug.
$objectManager = new MyOwnDependencyInjectionContainer();
Scope::$resolver = function ($className) use ($objectManager) {
return $context->get($className);
};
$r->addAPIClass('MyOwnApiClass');
作者说应该这样使用外接DIC:
Scope::$resolver = function ($className) use ($context) {
return $context->getByType($className);
};
我快到了,快工作了。我相信现在的问题与 Restler 依赖项没有被我的 DIC 加载有关。如前所述,我正在使用依赖注入容器 Pimple。我有一个名为 Main 的初始化 class,我在其中实例化 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:
<?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 Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Identifier "Luracast\Restler\Format\JsonFormat" is not defined.' in /var/www/kitchenkiosk.co/public_html/api/vendor/pimple/pimple/src/Pimple/Container.php:95
感谢您提供的任何帮助!
编辑 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,我现在有了解决方案!幸运的是 Restler RC6 PHP-DI 一旦正确集成就可以完美兼容。毫不奇怪,问题是我自己造成的。
这完全是命名空间的问题。我最初在 index.php 的开头定义了命名空间 Kiosk。 Luracast 建议将其保留在根命名空间中。
这是当前工作index.php:
<?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();
?>