/ / Hodnoty parametrov odovzdajte do __construct () pri použití zásobníka na vstrekovanie závislosti od Restler 3 Rozsah - php, injekcia závislosti, restler

Hodnoty parametrov prejdite do __construct () pri použití zásuvnej injekčnej nádoby zásuviek Restore 3 Scope - php, závislosť-vstrekovanie, znovuzískanie

Mám aplikáciu, ktorá používa DIC pupienok riadiť vstrekovanie závislosti; to funguje skvele pri volaní určitých metód cez príkazový riadok alebo interne. Keď sa ich však pokúsim zavolať pomocou rozhrania API poskytnutého programom Restler, vďaka tejto skutočnosti začne hádzať 500 chýbže __construct () nedostali potrebné parametre. (Všimnite si, že metódy vo vnútri triedy, ktoré nemajú __construct () alebo nevyžadujú žiadne parametre konštruktora, fungujú v poriadku pomocou rozhrania API.)

Snažím sa použiť Restler "s nazýva sa interný DIC Rozsah pôsobnosti, čo v skutočnosti nefunguje tak dobre. Napríklad, v index.php mám niečo také:

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

Problém je, že NoodlehausConfig vyžaduje cestu k konfiguračnému súboru kódovanému JSON po vytvorení inštancie. V mojej žiadosti sa to už riešilo v rámci pupienok.

Pri použití môjho Hlavná objekt nakladača, ktorý inštancuje pupienok a naplní kontajner potrebnými závislosťami, môžem bez problémov zavolať tú istú metódu priamo cez CLI:

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

Viem si predstaviť, že táto schopnosť existuje Rozsah pôsobnosti, ale bez príkladu alebo nejakej dokumentácie som to nedokázal zistiť. A úprimne povedané, chcel by som obmedziť svoje používanie Rozsah pôsobnosti čo najmenej, pretože je postavený na singletónovom vzore, ktorý v prvom rade poráža celú myšlienku použitia injekcie závislosti.

Naozaj by som chcel mať Restler prístup k metódam v mojich triedach a ich použitie pomocou inštancie pupienok, To by bolo skóre za integráciu.

edit:

Bol som nasmerovaný na táto žiadosť o chybu / funkciu na podporu vonkajšej injekčnej nádoby so závislosťou v Restler, Autor ju implementoval v nadchádzajúcom RC6.

Nemôžem však povedať, že som si úplne istý, že ho ešte môžem používať. Je tu uvedený príklad tu v súvisiacej chybe.

$objectManager = new MyOwnDependencyInjectionContainer();
Scope::$resolver = function ($className) use ($objectManager) {
return $context->get($className);
};
$r->addAPIClass("MyOwnApiClass");

Autor uvádza, že externý DIC by sa mal používať takto:

Scope::$resolver = function ($className) use ($context) {
return $context->getByType($className);
};

Už som skoro tam, skoro to funguje. Domnievam sa, že táto otázka má teraz niečo spoločné Restler závislosti nie sú načítané mojím DIC. Ako už bolo spomenuté vyššie, používam nádobu na vstrekovanie závislosti pupienok, Mám inicializačnú triedu s názvom Main, v ktorej inicializujem Pimple, nastavujem závislosti, načítam konfiguračný súbor atď.

Tu sú relevantné časti 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();

...
}
...
}

Toto je môj index.php:

<?php

namespace Kiosk;

use LuracastRestlerScope;
use LuracastRestlerRestler;

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

?>

Toto je chyba (môžem poskytnúť sledovanie zásobníka, ktoré bude užitočné :)

PHP Fatal error:  Uncaught exception "InvalidArgumentException" with   message "Identifier "LuracastRestlerFormatJsonFormat" is not defined." in     /var/www/kitchenkiosk.co/public_html/api/vendor/pimple/pimple/src/Pimple/Container.php:95

Ďakujeme vám za pomoc, ktorú vám môžeme poskytnúť!

Upraviť 2:

Zdá sa, že tento problém sa prehlbuje, ako keby jednoducho nemal závislosť pupienok, Mám podozrenie, že problém súvisí s rozdielom v štruktúre DIC:

PHP Fatal error:  Uncaught exception "InvalidArgumentException" with     message "Identifier "LuracastRestlerFormatJsonFormat" 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): PimpleContainer-        >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): LuracastRestlerScope::get("JsonFormat")
#3 /var/www/public_html/api/index.php(21): LuracastRestlerRestler->setSupportedFormats("JsonFormat")
#4 {main}
thrown in /var/www/public_html/api/vendor/pimple/pimple/src/Pimple/Container.php on line 95

Edit 3: Toto sú nové chyby po implementácii Luracastovho návrhu:

[$] 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. LuracastRestlerRestler->handle() /var/www/public_html/api/index.php:27
[$] PHP   3. LuracastRestlerRestler->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. LuracastRestlerResources->get() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Restler.php:1045
[$] PHP   6. LuracastRestlerResources->_parameter() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Resources.php:327
[$] PHP   7. LuracastRestlerResources->_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. LuracastRestlerRestler->handle() /var/www/public_html/api/index.php:27
[$] PHP   3. LuracastRestlerRestler->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. LuracastRestlerResources->get() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Restler.php:1045
[$] PHP   6. LuracastRestlerResources->_parameter() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Resources.php:327
[$] PHP   7. LuracastRestlerResources->_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. LuracastRestlerRestler->handle() /var/www/public_html/api/index.php:27
[$] PHP   3. LuracastRestlerRestler->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. LuracastRestlerResources->get() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Restler.php:1045
[$] PHP   6. LuracastRestlerResources->_parameter() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Resources.php:327
[$] PHP   7. LuracastRestlerResources->_model() /var/www/public_html/api/vendor/luracast/restler/vendor/Luracast/Restler/Resources.php:553

Pravdepodobne stojí za zmienku, že som implementoval iný injekčný kontajner závislosti, ktorý sa volá PHP-DI, Tento má syntax, ktorá je bližšia syntaxi Scope, takže som si myslel, že by bolo jednoduchšie pracovať s ním Restler, Dostávam však rovnaké chyby, ktoré sa vyskytli pri oboch.

odpovede:

0 pre odpoveď č. 1

Pokúsim sa nájsť jednoduchšie riešenie

<?php

use LuracastRestlerScope;
use LuracastRestlerRestler;

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["KioskDroneDrone"];
});

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

0 pre odpoveď č. 2

Vďaka Luracastovi mám teraz riešenie! našťastie Restler RC6 PHP-DI Akonáhle sú správne integrované, sú úplne kompatibilné. Problém nebol žiadnym prekvapením v mojej vlastnej tvorbe.

Všetko záležalo na mennom priestore. Pôvodne som definoval priestor mien kiosk na začiatku môjho index.php. Luracast navrhuje ponechať ho v koreňovom priestore mien.

Toto je aktuálny pracovný index.php:

<?php

use LuracastRestlerScope;
use LuracastRestlerRestler;
use KioskMain;
use KioskDroneDrone;

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

?>