簡體   English   中英

使用Restler 3的依賴項注入容器時將參數值傳遞給__construct()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM