No service of type PostsRepository found
- petrmachacek
- Člen | 3
Zdravím všechny Nettáky!
Začínám dělat na Nette jeden projekt, všechny problémy, které
nastávají, jsem úspěšně vyřešil vyhledáváním v dokumentaci či
fóru, ale teď jsem přišel na dost zvláštní věc.
Mám Nette 2.0.6 a PHP 5.4.4 na localhostu (XAMPP).
Mám vytvořený projekt se strukturou:
-app
_common - bez namespace
model
Authenticator.php - extends Nette\Object implements Security\IAuthenticator
Authorizator.php - extends Permission implements Nette\Security\IAuthorizator
PostsRepository.php - extends Repository
Repository.php - extends Nette\Object
UsersRepository.php - extends Repository
presenters
BasePresenter.php - extends Nette\Application\UI\Presenter
forms
FrontModule - namespace FrontModule
...
BackModule - namespace BackModule
components
forms
model
presenters
BasePresenter.php - extends \BasePresenter
DashboardPresenter.php - extends BasePresenter
...
templates
Společné části pro web i administraci mám v části _common, v _common/presenters/BasePresenter.php chci načíst modely, které budou potřeba v obou částech. Podle návodů a quickstartu jsem si je zaregistroval jako služby v config.neon:
services:
authenticator: Authenticator
authorizator: Authorizator
UsersRepository: UsersRepository
Repository:
class: Repository
autowired: no
PostsRepository:
class: PostsRepository
autowired: no
Všechno dobře fungovalo – mám už vytvořenou správu uživatelů, teď, když jsem chtěl přidat správu příspěvků (PostsRepository.php) a dal jsem do inject v _common/presenters/BasePresenter.php:
public function inject(Authenticator $authenticator, Authorizator $authorizator, Repository $repository, UsersRepository $usersRepository, PostsRepository $postsRepository) {
$this->repository = $repository;
$this->usersRepository = $usersRepository;
$this->authenticator = $authenticator;
$this->authorizator = $authorizator;
$this->postsRepository = $postsRepository;
}
tak to nefunguje a hlásí:
Nette\DI\ServiceCreationException
No service of type PostsRepository found. Make sure the type hint in Method BasePresenter::inject() is written correctly and service of this type is registered.
Když jsem metodu přepsal na:
public function inject(Authenticator $authenticator, Authorizator $authorizator, Repository $repository, UsersRepository $usersRepository) {
$this->repository = $repository;
$this->usersRepository = $usersRepository;
$this->authenticator = $authenticator;
$this->authorizator = $authorizator;
$this->postsRepository = $this->context->PostsRepository;
}
tak už to funguje, ale dočetl jsem se, že by se $this->context nemělo
používat, že lepší řešení je přes ty parametry inject. Předpokládám,
že tento problém souvisí s tím, že mám v config.neon vypnuté autowired,
ale když jsem to tam měl, tak to hlásilo, že existují dvě služby typu
Repository.
Netušíte někdo, co s tím? Ještě se v DI úplně nevyznám.
Cache jsem smazal a to nepomohlo.
Děkuji velice za pomoc.
- petrmachacek
- Člen | 3
Ano, mám tam metody pro načítání a ukládání nastavení, uložených v db. Možná by to mělo být ve speciální třídě, ale to udělám když tak potom…