Vývojová verze nefunguje rozdělení pomocí Extension

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
zool
Člen | 144
+
0
-

Ahoj mám problém u vývojové verze
rozdělil jsem si projekt pomocí Extension

v bootstrap mám

$configurator->onCompile[] = function ($configurator, $compiler) {
        $compiler->addExtension('shop', new \ShopExtension);
};

ve třídě ShopExtension

class ShopExtension extends \Nette\Config\CompilerExtension
{
    public $defaults = array(
        "itemsPerPage"  => 20,
        "order"         => 'nazev',
		"vyrobce"       => -1,
        "view"          => 1
    );
    public function loadConfiguration()
    {
        $config = $this->getConfig($this->defaults);
            $builder = $this->getContainerBuilder();
        $this->compiler->parseServices($builder, $this->loadFromFile(__DIR__ . '/../config/shop.neon'));
        $builder->getDefinition($this->prefix('data'))
            ->addSetup('setDefaults', array($config));

    }
}

v configu mám jen

services:
	shop.data:
		class: \Nastaveni\DataShop(@session)
factories:

no a když zavolám třeba v base presenter

$this->context->shop->data

tak to vyhodí vyjímku, že služba shop není definovaná
Děkuji

Majkl578
Moderator | 1364
+
0
-

A je? Já ji nikde definovanou nevidím. Definoval jsi pouze službu shop.data, nikoliv shop.
Správný přístup je tedy $context->getService('shop.data'), popř. $context->{'shop.data'}. Samozřejmě používání kontextu v rámci presenteru není úplně OK po stránce DI, proč nepoužiješ inject metody?
(Hint: Jinak asi toužíš po NestedAccessoru, který byl nedávno zrušen.)

zool
Člen | 144
+
0
-

Aha, právě že ve verzi 2.0.8 mi to funguje a právě u vývojové verze to kolabuje. Já myslel, že právě context je tam pro vytahování služeb, a v té inject metodě taky použiji context nebo ne? Nebo container? A jak se tedy pak dostanu do toho prostředí shop?? Když si v něm definuji službu?
Díky

enumag
Člen | 2118
+
0
-

Context a DI container je jedno a to samý. V inject metodách se nic takového nepoužívá.

zool
Člen | 144
+
0
-

Jo tak, a jak se třeba dostanu k této proměnné $this->context->httpRequest, když httpRequest není definovaná jako služba?

enumag
Člen | 2118
+
0
-

Je to služba. Jen ji definuje ne tvůj config ale NetteExtension. Což pro tebe nic nemění.

zool
Člen | 144
+
0
-

To ano, ale když použiji toto

/** @var HttpRequest */
    protected $httpRequest;
public function injectRequest(\HttpRequest $request)
    {
        if( $this->httpRequest )
        {
            throw new \Nette\InvalidStateException("Http has already been set");
        }
        $this->httpRequest = $request;
    }

tak mi to nefunguje.
Nápiše mi to právě No service of type HttpRequest found.

Editoval zool (15. 1. 2013 19:12)

jiri.pudil
Nette Blogger | 1032
+
0
-

Nette\Http\Request

zool
Člen | 144
+
0
-

Ajo díky super