neon – autowired – off – migrace na 2.2
- DavidTheNewbie
- Člen | 79
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)
- DavidTheNewbie
- Člen | 79
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
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
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
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
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
ale nejak v komponente/presenteru vytvaris tu komponentu authentication. jak?
- DavidTheNewbie
- Člen | 79
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
to mozna bude ten problem, komponenta musi byt pripojena k presenteru/komponente – treba prave v createComponentAuthentication metode
- DavidTheNewbie
- Člen | 79
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.