Korektní přístup k databázi z továrničky?

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

Čau. Potřebuju mít z továrničky přístup k databázi (a nebude to potřebovat jenom jedna továrnička). Chtěl jsem se zeptat, jaké řešení považujete za korektnější?

  1. Vytvořit BaseFormFactory.php, ve kterém pomocí DI vytvořit objekt databáze a následně ostatní továrničky dědit
  2. Odkazovat továrničku na metody modelů
  • nebo máte ještě nějaké lepší, vychytralejší řešení?
Namespace
Člen | 81
+
+2
-

Ahoj,
já to řeším tak, že si továrničce předám model, kterému předávám databázi. Zatím jsem neměl potřebu to nějak komplikovat a přijde mi to i celkem přehledné.

Pavel Kravčík
Člen | 1196
+
0
-

Ano, tohle řešení používám také. Komponenta nemusí nic řešit. Je lepší, než si předávat databázi a tu logiku tvořit uvnitř komponenty.

Injectnu si VozidloModel a v komponentě (třeba v success metodě formuláře) používám už jen její metody jako save().

HonDem
Člen | 30
+
0
-

Ok děkuju :)

Tomáš Votruba
Moderator | 1114
+
0
-

Mohl bys doplnit zdroják s komenty, co kde potřebuješ? Možná to jde řešit lépe a snadněji.

HonDem
Člen | 30
+
0
-

Samozřejmě. Řekněme, že mám továrničku EditPageFormFactory, která si má z databáze vytáhnout libovolný obsah stránky má umožnit jeho editaci.

class EditPageFormFactory extends BaseFormFactory
{
    private $editModel;
    private $pageId;

    public function __construct(EditModel $editModel)
    {
        $this->editModel = $editModel;
    }

    /**
     * @return Form
     */
    public function create($pageId)
    {
        $this->pageId = $pageId;
        $form = new Form;

        $form->addTextArea('content', 'Obsah stránky:');

        $form->addSubmit('send', 'Uložit');
        $form->setDefaults($this->editModel->getPage($pageId));

        $form->onSuccess[] = array($this, 'formSucceeded');
        return $form;
    }

    public function formSucceeded(Form $form, $values)
    {
        try{
			//tady potřebuji editovat obsah stránky
            $this->editModel->editPage($this->pageId, $values);
        } catch (Nette\Neon\Exception $e){
            $form->addError($e->getMessage());
        }
    }
}
  • tady v callbacku používám metody editModelu.

Napadá tě tedy nějaké lepší řešení?

Editoval HonDem (23. 7. 2015 12:21)

Pavel Kravčík
Člen | 1196
+
0
-

Ten $pageId si můžeš nastavit v setDefaults a poslat si ho v hidden inputu a nemusíš si vytvářet proměnnou pro třídu, možná to oceníš, až budeš používat EditPageModel jinde. Protože Tě to bude nutit dokola rozsekávat data a ID.

HonDem
Člen | 30
+
0
-

Já jsem si říkal, že se to dá vyřešit nějak lépe :D Děkuju moc!