Dependency injection Error
- sd
- Člen | 87
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)
- Tomáš Votruba
- Moderator | 1114
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.
- sd
- Člen | 87
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)
- sd
- Člen | 87
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
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
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
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
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
Toto:
$test = new App\Stock;
Ti projde? Jestli ne, projde to, když to dáš až za registraci RobotLoaderu?
Cache si smazal?
- sd
- Člen | 87
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
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
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 :(
- sd
- Člen | 87
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.