neon – autowired – off – migrace na 2.2

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

Ahojte. Rad bych pomoc pri migraci na 2.2. V 2.1 vypadal muj neon soubor s definici komponent takto:

# components factories.
factories:
	def1:
		class: web\lib\components\Component1(@service, %variable%, @configuration)

	dwf2:
		class: web\lib\components\Component2(@service, %variable%, @configuration)

	def3:
		class: web\lib\components\Component3(@service, %variable%, @configuration)

Po migraci na 2.2 se generuje chyba:

User Error → Exception in Nette\Bridges\ApplicationLatte\Template::__toString(): Component name must be integer or string, NULL given. in /var/www/html/…/vendor/nette/component-model/src/ComponentModel/Container.php:48

Chybu jsem uspesne vyresil takto:

# components factories.
factories:
	def1:
		class: web\lib\components\Component1(@service, %variable%, @configuration)
		autowired: off

	dwf2:
		class: web\lib\components\Component2(@service, %variable%, @configuration)
		autowired: off

	def3:
		class: web\lib\components\Component3(@service, %variable%, @configuration)
		autowired: off

Tj. u kzade komponenty pribylo autowired: off, coz mi pripada krkolomne. Nejde to ve 2.2 a vyse vyresit elegantneji?

Editoval DavidTheNewbie (18. 2. 2017 22:24)

Tomáš Votruba
Moderator | 1114
+
0
-

Ahoj, ako vyzerá constructor Component1?

DavidTheNewbie
Člen | 79
+
0
-

Tomáš Votruba napsal(a):

Ahoj, ako vyzerá constructor Component1?

Ahoj. Vypada presne takto (vyse uvedeny nastrel byl ilustracni):

# components factories.
factories:
    authentication:
        class: web\lib\components\Authentication(@authorization, %shop%, @configuration, @url, @sessionFactory, @translator, @httpRequest, @httpResponse)
class Authentication extends BaseControl
{
/**
	 *
	 * @param Authorization $auth
	 * @param string $shop
	 * @param Configuration $configuration
	 * @param URL $url
	 * @param Request $request
	 * @param Response $response
	 * @param SessionFactory $sessionFactory
	 * @param IRequest $httpRequest
	 * @param IResponse $httpResponse
	 */
	public function __construct(Authorization $auth, $shop, Configuration $configuration,
			URL $url, SessionFactory $sessionFactory, Translator $translate,
			IRequest $httpRequest, IResponse $httpResponse) {
		$this->httpRequest = $httpRequest;
		$this->httpResponse = $httpResponse;
		$this->auth = $auth;
		$this->shopId = $shopId;
		$this->configuration = $configuration;
		$this->url = $url;

		$this->portalGroupId = $this->configuration->getGroupId(
			$this->shop,
			Configuration::TYPE_SHOP
		);

		$this->languageId = $this->configuration->getLanguageId(
			$this->shop,
			Configuration::TYPE_SHOP
		);

		$this->sessionNamespace = $sessionFactory->getNamespace(
			self::PASSWORD_RECOVERY
		);

		$this->sessionFactory = $sessionFactory;
}

Editoval DavidTheNewbie (19. 2. 2017 8:34)

Tomáš Votruba
Moderator | 1114
+
0
-

Vypadá to totiž, že chybí volání construtoru v BaseControl.

Component name must be integer or string, NULL given

V constructoru se dříve dával název komponenty právě přes ctor, a když jsi ho přepsal, tak to zřejmě hodilo tuto chybu.

David Matějka
Moderator | 6445
+
+3
-

parent konstruktor se nemusi volat.

Spise to vypada, ze s tou komponentou pozdeji nejak spatne pracujes. Kde a jak ji vytvaris?

a mimochodem, factories jsou deprecated, mel bys pouzit generovane tovarny (iirc uz v 2.2 byly)

DavidTheNewbie
Člen | 79
+
0
-

Tomáš Votruba napsal(a):

Vypadá to totiž, že chybí volání construtoru v BaseControl.

Component name must be integer or string, NULL given

V constructoru se dříve dával název komponenty právě přes ctor, a když jsi ho přepsal, tak to zřejmě hodilo tuto chybu.

Po pridani konstruktoru do BaseControl to vypadalo nadejne. Z trech uvedenych komponent v neon souboru jsem u prvni z nich odstranil autowired: off a zabralo to. Pak jsem ale chtel odebrat autowired: off u zbyvajicih a vygenerovala se chyba:

Nette\DI\ServiceCreationException → Service ‚…(anotherComponentName)…‘: Multiple services of type Nette\ComponentModel\IContainer found: ..(anotherComponentName).., authentication

Editoval DavidTheNewbie (19. 2. 2017 22:13)

DavidTheNewbie
Člen | 79
+
0
-

David Matějka napsal(a):

parent konstruktor se nemusi volat.

Spise to vypada, ze s tou komponentou pozdeji nejak spatne pracujes. Kde a jak ji vytvaris?

a mimochodem, factories jsou deprecated, mel bys pouzit generovane tovarny (iirc uz v 2.2 byly)

Pozdeji se komponenta vytvari volanim v latte sablone {control authentication}

Editoval DavidTheNewbie (19. 2. 2017 22:14)

David Matějka
Moderator | 6445
+
0
-

ale nejak v komponente/presenteru vytvaris tu komponentu authentication. jak?

DavidTheNewbie
Člen | 79
+
0
-

David Matějka napsal(a):

ale nejak v komponente/presenteru vytvaris tu komponentu authentication. jak?

Komponentu vytvari pouze volani {control authentication}, ktere se v ramci latte a definice v neon souboru viz vyse pretransformuje v PHP kod.

David Matějka
Moderator | 6445
+
+1
-

to mozna bude ten problem, komponenta musi byt pripojena k presenteru/komponente – treba prave v createComponentAuthentication metode

DavidTheNewbie
Člen | 79
+
0
-

David Matějka napsal(a):

to mozna bude ten problem, komponenta musi byt pripojena k presenteru/komponente – treba prave v createComponentAuthentication metode

Je to mozne. Zatim se situace vyresila tim, ze se do komponenty umistil konstruktor s volanim rodice. V takovem pripade uz chyba zmizela a dokonce jiz neni potreba v neon souboru uvadet zminovanou konfiguracni hodnotu autowired: off.