Jak hezky používat model v Presenteru

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

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*()

  1. 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ě.

  1. dotaz

Proč se modelům říká Repository, nebo nastala nějaká změna v modelech ?

  1. 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
+
0
-
  1. 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
+
0
-

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
+
0
-

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)