ModelsContainer v DI – dobre riesenie?
- lupo112
- Člen | 11
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
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)