umístění složky model při více modulech
- argosovo
- Člen | 54
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
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.
- greeny
- Člen | 405
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í.