使用Restler 3的依赖注入容器范围

时间:2015-06-26 21:14:10

标签: php dependency-injection restler

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

我正在尝试使用名为 Scope Restler 内部DIC,但这并非如此。例如,我在index.php中有类似的东西:

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

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

当使用我的 Main 加载器对象,它实例化 Pimple 并使用所需的依赖项填充容器时,我可以通过CLI直接调用相同的方法,而不会出现任何问题这样:

$file = __DIR__ . "/config.json";
$main = new Main($file);
$d = new Kiosk\Drone\Drone($main->c['config']);

我想这个功能就在 Scope 中,但是如果没有示例或某些文档,我就无法弄明白。坦率地说,我希望将 Scope 的使用限制在尽可能少的范围内,因为它是基于单例模式构建的,这种方式违背了使用依赖关系的整个想法注射首先。

我真的希望能够让 Restler 访问我的类中的方法,并使用 Pimple 对它们进行实例化。这将是整合的分数。

编辑:

我已被定向到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);
};

我快到了,差不多了。我认为现在的问题与我的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:

问题似乎更深入,而不仅仅是在疙瘩中没有依赖关系。我怀疑这个问题与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 更简单。但是,我得到了两者完全相同的错误。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

感谢Luracast,我现在有了解决方案!幸运的是, Restler RC6 PHP-DI 在正确集成后完全兼容。这个问题毫无疑问是我自己制作的。

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

这是当前工作的index.php:

ConcurrentModificationException