Základní vytvoření továrny
- petrkasnal
- Člen | 42
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 :)
- petrkasnal
- Člen | 42
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
Jo už jsem na to přišel jsem blb…
$this->categoryFactory = new \CategoryFactory($database);
Moc ti děkuju :)
- ali
- Člen | 342
@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
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
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
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.
- petrkasnal
- Člen | 42
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
@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
v zavorce se nemusi uvadet to @Nette\Database\Context
staci
- CategoryFactory
(btw, spravny nazev by bylo spise CategoryFormFactory)
- petrkasnal
- Člen | 42
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ěď
- petrkasnal
- Člen | 42
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
v tom konstruktoru to uvest musis – jak to mas nyni. ale nemusis to uvadet v configu
- petrkasnal
- Člen | 42
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
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
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
- petrkasnal
- Člen | 42
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