Základní vytvoření továrny

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

Zdravím mám problém se základním vytvoření továrny… Zkoušel jsem to podle oficiálního tutoriálu a hledal sjem i zde na foru, ale továrna ne a ne pracovat. Mam s tím opravdu problém a vím, že tam budu mít asi hloupý chyby takže se předem omlouvám…
Factory:

<?php

use Nette\Application\UI;

class CategoryFactory extends Nette\Object
{
    private $database;

    public function __construct(Nette\Database\Connection $database)
    {
        $this->database = $database;
    }

    public function create()
    {
        $form = new UI\Form;
        $form->addSubmit('send', 'Odeslat');
        $form->onSuccess[] = [$this, 'processForm'];

        return $form;
    }

    public function processForm($form)
    {
        $values = $form->getValues();
        return $this->database->table('projects')->insert($values);
    }
}

Presenter:

<?php

namespace App\Presenters;

use Nette;
use App\Model;

class HomepagePresenter extends BasePresenter {

    private $database;
    public $categoryFactory;

    public function __construct(Nette\Database\Context $database) {
        $this->database = $database;
    }

    public function renderDefault() {
        $this->template->posts = $this->database->table('posts');
    }

    protected function createComponentCategoryForm()
    {
        $form = $this->categoryFactory->create();
        return $form;
    }

}

Továrnu samozřejmě mám registrovanou v configu :) Všem moc děkuji za rady :)

CZechBoY
Člen | 3608
+
+1
-

Tak a teď napiš co to dělá/nedělá, jinak můžem ledatak věštit z věštecký koule.

Zkusim si zavěštit a tipnout, že voláš create na null v presenteru? Předej si i tu categoryFactory přes konstruktor jako si předáváš tu databázi.

petrkasnal
Člen | 42
+
0
-

Omlouvám se a dík moc za odpověď ano přesně tak je to create na null… Zkoušel jsem ten konstruktor a prosimtě mohl by si mi poslat jak by měl vypadat píšu ho nějak špatně… ?

petrkasnal
Člen | 42
+
-3
-

Jo už jsem na to přišel jsem blb…

$this->categoryFactory = new \CategoryFactory($database);

Moc ti děkuju :)

ali
Člen | 342
+
+4
-

@petrkasnal kdyz mas tu tovarnu zaregistrovanou v configu, proc ji pak vytvaris znovu pres new?

config.neon

services:
	- CategoryFactory(@Nette\Database\Context)

presenter

/** @var CategoryFactory @inject */
public $categoryFactory;

...

protected function createComponentCategoryForm() {
	$form = $this->categoryFactory->create();
	return $form;
}
Barvoj
Člen | 60
+
+3
-

Nebo tak jak to myslel @CZechBoY

config.neon

services:
    - CategoryFactory

presenter

private $database;
private $categoryFactory;

public function __construct(Nette\Database\Context $database, \CategoryFactory $categoryFactory) {
    $this->database = $database;
    $this->categoryFactory = $categoryFactory;
}
petrkasnal
Člen | 42
+
0
-

Jo díky moc použil jsem řešení od Barvoj, ale líbí se mi i od aliho mohli by si to trochu rozepsat, jestli máš tedy čas ? Jsem začátečník a nedomyslím si to :D Díky moc :)

Zuben45
Člen | 268
+
+1
-

asi bych tě odkázal na dokumentaci https://doc.nette.org/cs/configuring#…

petrkasnal
Člen | 42
+
0
-

Z dokumentace to moc nechápu ty jo…

Zuben45
Člen | 268
+
0
-

petrkasnal napsal(a):

Z dokumentace to moc nechápu ty jo…

dobře, tak zkusím to vysvětlit jednoduše. Jedná se o dobrou vlastnost nette, zapíšeš si službu do konfiguračního souboru (tím ji zaregistruješ), a poté kdykoliv budeš potřebovat tuto službu tak si ji vyžádáš třeba v konstruktoru jako typehint a nette si samo vytvoří její instanci a předá ti ji do konstruktoru.

matopeto
Člen | 395
+
+1
-

Je to to same ako si si uz predaval Nette\Database\Context $database v konstruktore :)

petrkasnal
Člen | 42
+
0
-

Takže je to jenom pro přehlednost ? Nevím jestli to chápu správně a omlouvám se, že jsem tak natvrdlý…
Kdy tedy konstruktor v presenteru vypadá takhle:

public function __construct(Nette\Database\Context $database, \CategoryFactory $categoryFactory) {
        $this->database = $database;
        $this->categoryFactory = $categoryFactory;
    }

A v configu:

- CategoryFactory(@Nette\Database\Context)
ali
Člen | 342
+
0
-

@petrkasnal pokud nechces pracovat s databazi v presenteru (coz mozna jeste nevis, ale opravdu nechces :-)), tak v tom konstruktoru tu databazi mit nemusis, ale uz ji budes mit v te tovarnicce (Nette ti ji tam vlozi diky tomuto zapisu @Nette\Database\Context co mas v configu

Editoval ali (29. 6. 2017 16:20)

David Matějka
Moderator | 6445
+
+1
-

v zavorce se nemusi uvadet to @Nette\Database\Context
staci

- CategoryFactory

(btw, spravny nazev by bylo spise CategoryFormFactory)

petrkasnal
Člen | 42
+
0
-

ali napsal(a):

@petrkasnal pokud nechces pracovat s databazi v presenteru (coz mozna jeste nevis, ale opravdu nechces :-)), tak v tom konstruktoru tu databazi mit nemusis, ale uz ji budes mit v te tovarnicce (Nette ti ji tam vlozi diky tomuto zapisu @Nette\Database\Context co mas v configu

Okej díky to chápu, ale jak mam tedy potom třídní proměnné database předat ten objekt ?

	private $database;

public function __construct()
{
    $this->database = ?;
}

Jak se s tím tedy prosím pracuje ? Díky moc za odpověď

CZechBoY
Člen | 3608
+
0
-

Stejne. Jde jen o to, ze v konfiguraci si to Nette samo zjisti a ty se nemusis namahat to zjidtovat.

petrkasnal
Člen | 42
+
0
-

CZechBoY napsal(a):

Stejne. Jde jen o to, ze v konfiguraci si to Nette samo zjisti a ty se nemusis namahat to zjidtovat.

Úplně jsem tě nepochopil… Takže to bude vypadat furt tkhle ? a co nemusim zjišťovat ?

	private $database;
public function __construct(Nette\Database\Context $database)
{
    $this->database = $database;
}
David Matějka
Moderator | 6445
+
+1
-

v tom konstruktoru to uvest musis – jak to mas nyni. ale nemusis to uvadet v configu

petrkasnal
Člen | 42
+
0
-

David Matějka napsal(a):

v tom konstruktoru to uvest musis – jak to mas nyni. ale nemusis to uvadet v configu

Takže v tom configu je to jen pro přehlednost jestli to teda konečně chápu ?

David Matějka
Moderator | 6445
+
0
-

ne, v configu to registrujes jako sluzbu, aby sis to mohl vyzadat v presenteru. ale v tom configu jiz znovu nemusis uvadet zavislosti

petrkasnal
Člen | 42
+
0
-

David Matějka napsal(a):

ne, v configu to registrujes jako sluzbu, aby sis to mohl vyzadat v presenteru. ale v tom configu jiz znovu nemusis uvadet zavislosti

Jo no to je jasný, že jí registruju v configu promiň blbě jsem to napsal. Myslel jsem to že tedy uvádění závislostí je jenom záležitost přehlednosti

CZechBoY
Člen | 3608
+
0
-

@petrkasnal spíš je to nepřehlednost než přehlednost :-)) Hlavně je to náročný na údržbu když chceš později změnit parametry.

petrkasnal
Člen | 42
+
0
-

CZechBoY napsal(a):

@petrkasnal spíš je to nepřehlednost než přehlednost :-)) Hlavně je to náročný na údržbu když chceš později změnit parametry.

Super moc ti děkuju :) Omlouivám se, že jsem tak natvrdlý :D