ModelsContainer v DI – dobre riesenie?

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

Zdravím,
v nette nerobím dlho a tak sem tam narazím na nejaký problém.

Už dávnejšie som hľadal nejaké riešenie automatického načítavania modelov, respektíve automatiké vytváranie objektov týchto modelov. Inými slovami, chcel by som používať v kóde niečo ako

$this->model->posts->findById($id);

kde by som mal vytvorený samostatný objekt PostsModel s metódou findById.

Toto som vyriešil tak, že som vytvoril v neone nový service:

	services:
		...
		model:
			class: ModelsContainer
		...

a trieda ModelsContainer vypada nejak takto:

/**
 * Object for creating models
 *
 * @author Lukes
 */
class ModelsContainer extends \Nette\DI\Container {

	public function getService($name) {
		try {
			return parent::getService($name);
		}
		catch (\Exception $e) {
			$class = Strings::firstUpper($name.'Model');
			return $this->addService($name, new $class);
		}
	}

}

Samozrejme som si v BasePresentery vytvoril funkciu pre prístup k service model priamo cez parameter.
Tak a teraz mi povedzte, je to dobre riešenie?
Prečo niečo takéto nie je vyriešené už priamo vo FW?
Je možné niečo vylepšiť?

Díky. Lukes.

Editoval lupo112 (23. 7. 2011 18:05)

Filip Procházka
Moderator | 4668
+
0
-

Tak a teraz mi povedzte, je to dobre riešenie?

Není to špatné řešení a je to v podstatě jen o hodně kratší Dynamické načítání modelů

Jenom bych doporučil šetrnější variantu

	public function getService($name) {
		if (!$this->hasService($name)) {
			$class = Strings::firstUpper($name.'Model');
                $this->addService($name, new $class);
		}

		return parent::getService($name);
}

Není dobré zachytávat úplně všechny výjimky.

Prečo niečo takéto nie je vyriešené už priamo vo FW?

To, že něco takové není ve frameworku, je v současné době považováno za feature. Tvoje řešení nemusí vyhovovat všem a mě osobně by obtěžovalo.

Je možné niečo vylepšiť?

Tohle nepovažuji za vylepšení. Vnucoval by jsi konvenci, která vyhovuje tobě, né však ostatním.

Editoval HosipLan (23. 7. 2011 19:23)

lupo112
Člen | 11
+
0
-

Je mi jasne že by to bola konvencia, ale príde mi to ako najvhodnejšie riešenie, pokiaľ sa nechcem stále starať o modely. A vďaka za pomoc. Upravil som to.

Pokiaľ by boli ešte nejaké nápady, rád vypočujem.

gawan
Člen | 110
+
0
-

HosipLan napsal(a):
To, že něco takové není ve frameworku, je v současné době považováno za feature. Tvoje řešení nemusí vyhovovat všem a mě osobně by obtěžovalo.

a aké riešenie vyhovuje tebe?