[英]Pass parameter values into __construct() when using Restler 3's dependency injection container Scope
我有一个使用DIC Pimple来管理依赖注入的应用程序。 通过命令行或内部调用某些方法时,效果很好。 但是,一旦我尝试通过Restler提供的API调用它们,由于__construct()没有提供所需的参数,它将开始引发 500个错误。 (请注意,没有__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 loader对象,该对象实例化Pimple并使用所需的依赖项填充容器时,我能够直接通过CLI调用相同的方法,而不会出现任何类似的问题:
$file = __DIR__ . "/config.json";
$main = new Main($file);
$d = new Kiosk\Drone\Drone($main->c['config']);
我认为Scope中具有此功能,但是如果没有示例或某些文档,我将无法弄清楚。 坦率地说,由于范围是基于单例模式,因此我想将Scope的使用限制为尽可能少,这首先挫败了使用依赖项注入的整个想法。
真的,我希望Restler可以访问类中的方法并使用Pimple实例化它们。 那将是一个综合得分。
编辑:
我已被定向到此Bug /功能请求,以支持Restler中的外部依赖项注入容器。 作者已在即将发布的RC6中实现了它。
$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);
};
我快到了,快要工作了。 我相信这个问题现在与我的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:
<?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();
?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.