umístění složky model při více modulech

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

Ahoj,
s Nette teprve začínám, tak bych tu měl takový skromný dotaz – před chvíli se mi povedlo rozdělit adresářovou strukturu na více modulů, ale vzhledem k tomu, co se píše o třídách modelu, které by měly být nezávislé na view a controller(?), chtěl jsem je nechat v původním umístění – složky „model“, takže mám:
app/
–FrontModule/
----presenters/
----templates/
–ImportModule/
----presenters/
----templates/
–model/
----FrontModule/
----ImportModule/
–config/
–router/

přes config.neon si zavedu import: Model\ImportModule\Import(do této chvíle vše funguje), v Presenteru se ale k této službě modelu nedokážu dostat jinak než přes metodu injectUsersModels, samotný presenter pracuje v namespace App\ImportModule\Presenters, pokud zkusím načíst přes inject Model\ImportModule\Import $import, dojde k chybě protože služba se logicky hledá na namespace+umístění tedy App\ImportModule\Presenters\Model\ImportModule\Import, problém byl řekl že chápu, ale buď je něco radikálně špatně v mé struktuře aplikace, nebo existuje něco o čem nevím, co řekne aplikaci, že modely má hledat strukturně výš než namespace. Teda jestli z tohodle popisu někdo pozná v čem je problém a zkusí poradit, tak děkuji(nejsem si totiž jist ani tím že mám správné názvosloví).
Dík,
Martin

Editoval argosovo (28. 2. 2014 22:42)

Šaman
Člen | 2666
+
0
-

Když v typehintu (nebo anotaci @inject) použiješ celé namespace, tak dej i počáteční lomítko. Tak uděláš namespace absolutní a nepřidává se k aktuálnímu NS.
Anebo použij use sekci, kde počáteční lomítko zadávat nemusíš.
P.S. Pokud injectuješ pomocí anotace, tak musíš vždy uvést celý NS, protože při parsování anotace se sekce use nezohledňuje. Proto používám raději inject metody.

argosovo
Člen | 54
+
0
-

Děkuji mnohokrát, vše funguje po prvním přečtení tvé odpovědi, opravdu to bylo o tom jednom lomítku na začátku a nyní když jsi to napsal, zdá se to tak jasné. Nicméně varianta s „use“ mi zatím nefunguje, ale na to se ještě podívám…

Editoval argosovo (1. 3. 2014 0:41)

greeny
Člen | 405
+
0
-

Anotace @inject zatím nepoužívá use statementy, takže následující kód ti nebude fungovat

<?php
namespace A\B;

use Model\FooModel;

class FooPresenter extends BasePresenter {

	/** @var FooModel @inject */
	public $fooModel; // Nette si myslí, že chceš třídu \A\B\FooModel, ty ale chceš \Model\FooModel

}
?>

Radši použij tohle:

<?php
namespace A\B;

use Model\FooModel;

class FooPresenter extends BasePresenter {

	/** @var FooModel */
	protected $fooModel;

	public function injectFooModel(FooModel $fooModel) { // díky použitému use se toto přeloží jako \Model\FooModel
		$this->fooModel = $fooModel;
	}

}
?>

Podpora use statementů pro první případ možná zavedena bude ( můj pull ), ale zatím není.