Dependency injection Error

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

Zdravím,

mám takový velmi kuriózní problém…

Při pokusu o DI mi vypisuje chybu, že jsem špatně napsal jméno třídy (Nette\InvalidStateException:
Please use a fully qualified name of class/interface in @var annotation at App\Presenters\StockPresenter::$stock property. Class ‚App\Presenters\App\Stock‘ cannot be found.
)

Zajímavé je, že když přepíši Stock na UserManager a zde vše funguje. Třídu Stock už jsem ze zoufalství přepsal kódem z UserManageru (jen jsem změnil název třídy a namespace), ale ani to nepomohlo :/

Presenter:

<?php

namespace App\Presenters;

use Nette,
	App\Model;

/**
 * Stock presenter.
 */
class StockPresenter extends BasePresenter
{
        /**
         * @var App\Stock
         * @inject
         */
        public $stock;

	...

}

Třída Stock (umístěná ve složce app/model):

<?php

namespace App;

use Nette;

class Stock
{
...
}

Děkuji za radu,
sd

Editoval sd (6. 5. 2014 20:19)

David Grudl
Nette Core | 8235
+
0
-

Použij \App\Stock s lomítkem.

Tomáš Votruba
Moderator | 1114
+
0
-

Přidat use App; by také zřejmě pomohlo. Případně si přečti něco o namespace, o které tu jde. Nikoliv DI.

Šaman
Člen | 2666
+
0
-

use App; dříve v injectech pomocí anotace nefungovalo. Bylo potřeba uvést celé NS. Nevím, jestli se to už změnilo.
U method/constructor inject je to v pohodě, pokud je název třídy součástí PHP kódu (a nikoliv komentáře).

David Matějka
Moderator | 6445
+
0
-

use App funguje od tohoto commitu, ktery vsak neni v 2.1

sd
Člen | 87
+
0
-

Děkuji, za odpovědi, ale bohužel nic nepomohlo. Nevím co dělám špatně :\. Ale třeba UserManager v pohodě funguje a ikdyž jsem měl stejný kód jako v UserManager ve Stock, stejně to nefungovalo :(.

Vypisuje chybu:

Nette\InvalidStateException

Please use a fully qualified name of class/interface in @var annotation at App\Presenters\StockPresenter::$stock property. Class '\App\Stock' cannot be found.

Kód presenteru StockPresenter.php:

<?php

namespace App\Presenters;

use Nette,
	App;

/**
 * Stock presenter.
 */
class StockPresenter extends BasePresenter
{
        /**
         * @var \App\Stock
         * @inject
         */
        public $stock;
...

Třída Stock.php umístěná ve složce app/model:

<?php

namespace App;

use Nette;

class Stock
{
...

Editoval sd (21. 5. 2014 10:21)

Michal Vyšinský
Člen | 608
+
0
-

A co ti to píše teď? Máš Stock zaregistrované jako službu?

sd
Člen | 87
+
0
-

Michal Vyšinský napsal(a):

A co ti to píše teď? Máš Stock zaregistrované jako službu?

Píše:

Nette\InvalidStateException

Please use a fully qualified name of class/interface in @var annotation at App\Presenters\StockPresenter::$stock property. Class '\App\Stock' cannot be found

Nikde jsem to jako službu neregistroval… Tak to bude asi ta chyba :D

Michal Vyšinský
Člen | 608
+
0
-

Ano to bude. A ještě můžeš zkusit třeba v bootstrap.php instancovat tu třídu, abys zjistil, zda ti ji RobotLoader načítá

Editoval Michal Vyšinský (21. 5. 2014 10:39)

sd
Člen | 87
+
+1
-

Michal Vyšinský napsal(a):

Ano to bude. A ještě můžeš zkusit třeba v bootstrap.php instancovat tu třídu, abys zjil, zda ti ji RobotLoader načítá

Děkuji za odpověď :). Registrace se provádí jen v config.neon, je to tak?

Část config.neon

services:
	- App\UserManager
	- App\RouterFactory
	- App\Stock
	router: @App\RouterFactory::createRouter

Píše ale chybu:

Nette\DI\ServiceCreationException

Class App\Stock used in service '23_App_Stock' has not been found or is not instantiable.

Když přidám do bootstrap.php

$test = new App\Stock;

Vyhodí chybu, že třídu nenašel:

Fatal error: Class 'App\Stock' not found in /Applications/XAMPP/xamppfiles/htdocs/Test/sandbox/app/bootstrap.php on line 6

Editoval sd (21. 5. 2014 10:41)

Michal Vyšinský
Člen | 608
+
0
-

A ještě můžeš zkusit třeba v bootstrap.php instancovat tu třídu, abys zjistil, zda ti ji RobotLoader načítá

Jak máš v bootstrap.php nastavený RobotLoader a kde máš uložený soubor s třídou App\Stock?

Edit: ano , registrace by měla být v pořádku

Editoval Michal Vyšinský (21. 5. 2014 10:41)

sd
Člen | 87
+
0
-

Michal Vyšinský napsal(a):

A ještě můžeš zkusit třeba v bootstrap.php instancovat tu třídu, abys zjistil, zda ti ji RobotLoader načítá

Jak máš v bootstrap.php nastavený RobotLoader a kde máš uložený soubor s třídou App\Stock?

Edit: ano , registrace by měla být v pořádku

Takto vypadá můj bootstrap.php:

<?php

require __DIR__ . '/../vendor/autoload.php';

$configurator = new Nette\Configurator;
$test = new App\Stock;

//$configurator->setDebugMode(TRUE);  // debug mode MUST NOT be enabled on production server
$configurator->enableDebugger(__DIR__ . '/../log');

$configurator->setTempDirectory(__DIR__ . '/../temp');

$configurator->createRobotLoader()
	->addDirectory(__DIR__)
	->addDirectory(__DIR__ . '/../vendor/others')
	->register();

$configurator->addConfig(__DIR__ . '/config/config.neon');
$configurator->addConfig(__DIR__ . '/config/config.local.neon');

$container = $configurator->createContainer();

return $container;
Michal Vyšinský
Člen | 608
+
0
-

a kde máš ten soubor se Stock třídou? případně zkus smazat cache.

sd
Člen | 87
+
0
-

Michal Vyšinský napsal(a):

a kde máš ten soubor se Stock třídou? případně zkus smazat cache.

Stock.php mám v app/model/

Michal Vyšinský
Člen | 608
+
0
-

Toto:

$test = new App\Stock;

Ti projde? Jestli ne, projde to, když to dáš až za registraci RobotLoaderu?

Cache si smazal?

sd
Člen | 87
+
+1
-

Michal Vyšinský napsal(a):

Toto:

$test = new App\Stock;

Ti projde? Jestli ne, projde to, když to dáš až za registraci RobotLoaderu?

Cache si smazal?

Když mám

$test = new App\Stock;

tak, jak je v kódu bootstrapu výše vypíše chybu, kterou jsem psal už výše..

Pokud incializuju Stock až na úplném konci, naspokčí opět chyba

Nette\DI\ServiceCreationException

Class App\Stock used in service '23_App_Stock' has not been found or is not instantiable.

Cache jsem mazal.

Michal Vyšinský
Člen | 608
+
0
-

Hm divné. Můžeš to dát třeba na github/bitbucket? (Myslím tím celý projekt)

Editoval Michal Vyšinský (21. 5. 2014 11:01)

Džízis Crust
Člen | 10
+
0
-

Zdravím,

přišli jste na něco? Narazil jsem na stejný problém a řešení nebo nápověda je po x hodinách hledání stále v nedohlednu :(

Šaman
Člen | 2666
+
0
-

Michal Vyšinský napsal(a):

Hm divné. Můžeš to dát třeba na github/bitbucket? (Myslím tím celý projekt)

sd
Člen | 87
+
0
-

Zdravím, omlouvám se, že píši až teď…

Podařilo se mi to nakonec vyřešit, tak, že jsem po implementování všech rad zde napsaných jsem vytvořil ještě jeden soubor Stock2.php opět v modelu, a postupně tam vše přepsa/překopíroval a ono se to nějak rozběhlo. Je to divný, ale pomohlo to. Poté jsem jen smazal původní soubor a přejmenoval STock2 na Stock a vše běželo, jak mělo :).

Děkuji všem za rady a omlouvám se za takto pozdní reakci.