No service of type PostsRepository found

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

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.

ViPEr*CZ*
Člen | 817
+
0
-

Jen se zeptám… toto je potřeba vytvářet:

Repository:
        class: Repository
        autowired: no
petrmachacek
Člen | 3
+
0
-

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…

ViPEr*CZ*
Člen | 817
+
0
-

Jasný, s tím autowired to musí někdo kompetentnější, kdo zná zdroják Nette jestli to je chyba nebo to takto nejde. Z návrhu jsem spíše usuzoval udělat třídu Repository jako abstraktní.

gliny
Člen | 25
+
0
-

Přišel někdo na to jak to správně dostat do presenteru, použil jsem zatím řešení od petrmachacek, ale není to asi moc správné, hlavně kvůli tomu že to nepojede v nette 2.1 :|