Jak hezky používat model v Presenteru
- Myiyk
- Člen | 321
Ahoj,
je všeobecně známo, že se nemá používat context.
Takže předpokládám že si mám modely načítat přes inject*()
- dotaz
Jak udělat, abych mohl volat
$this->frontModel->nejakyRepository->metoda() ?
(tohle by volalu třídu FrontModule\Model\nejakyRepository)
Mám více modulů a nechci mít všechny Repository na jedné hromadě.
- dotaz
Proč se modelům říká Repository, nebo nastala nějaká změna v modelech ?
- dotaz
Jak ideálně do modelů dostat proměnnou $this->lang
(má informaci o jazyku, na který je uživatel přepnut)?
Nehodlám jazyk předávat v každé metodě.
Měl jsem v projektu všechno na jedné hromadě, ale teď jsem to předělal na AdminModule a FrontModule. Proto chci také nějak hezky vyřešit ty modely, abych s nimi konečně měl klid.
- mkoubik
- Člen | 728
- dotaz
Proč se modelům říká Repository, nebo nastala nějaká změna v modelech ?
Model není třída, ale vrstva aplikace (tohle zmatení pojmů přišlo nejspíš z railsů?). Zatímco Repository je návrhový vzor který daná třída implementuje, proto to má často v názvu.
- Reloecc
- Člen | 15
Měl bych to forum pročítat častěji..
1. dotaz:
nově lze v nette 2.1 použít v každé službě (repository budeš mít jako službu) tyto dva způsoby:
use \Namespace\To\NejakyRepository;
class MujPresenter extends BasePresenter //presenter je rovněž komponenta
{
/** první způsob
* @inject
* @var \Namespace\To\NejakyRepository
*/
public $nejakyRepository;
/** druhý způsob
* @param NejakyRepository $repository
*/
injectNejakyRepository(NejakyRepository $repository){
$this->nejakyRepository = $repository;
}
}
ve starší verzi (v nové stále funkční) pak:
use \Namespace\To\NejakyRepository;
class Komponenta extends Control
{
/** první způsob
* @var NejakyRepository $nejakyRepository
*/
private $nejakyRepository;
/**
* @param NejakyRepository $repository
*/
function __construct(NejakyRepository $repository){
$this->nejakyRepository = $repository;
}
/** druhý způsob při zapojení config.neon
* @param NejakyRepository $repository
*/
injectNejakyRepository(NejakyRepository $repository){
$this->nejakyRepository = $repository;
}
}
config.neon
services: nejakyRepository: \Namespace\To\NejakyRepository factories: komponenta: class: Komponenta setup: - injectNejakyRepository
V novější i starší verzi je správnější použít pro komponentu prohnanou skrz DI továrničky
inject* funguje u starší verze nette jen u presenterů
setup je možné použít i u služeb
do komponent lze služby předávat i v konstruktoru, pokud komponenta projde
DI, dohledá je nette sám
- Reloecc
- Člen | 15
3. dotaz
já za vhodné vidím:
- pro translator si vytvořit vlastní třídu (zaregistrovat ji jako službu, implementovat do ní Nette\Localization\ITranslator)
- všechny komponenty dědit z jedné třídy (např. MyControl)
- v MyControl nastavit translator (->setTranslator)
- v translatoru nastavit
$lang
v konstruktoru ze session - pokud nelze načítat ze session, (např. v případě volby jazyka
z domény) pak definovat lang v
Presenter::startUp()
pomocí nějakého$this->translator->setLang('cs-CZ')
- v krajním případě lze definovat proměnnou předáním parametru do setup funkce služby translator:
services:
translator:
class: Nmspc\Translator
setup:
- setLang(%lang%)
Editoval Reloecc (16. 7. 2013 17:40)