Jak začít používat Doctrine v Nette Framework
- andros
- Člen | 145
Ahoj,
smažím se rozchodit Kdyby Doctrine v Nette. Našel jsem tento návod: http://blog.honzacerny.com/…te-framework a dále toto: https://github.com/…/en/index.md
Podle těchto návodu jsem se dostal sem:
config.neon:
parameters:
application:
errorPresenter: Error
mapping:
*: App\*Module\Presenters\*Presenter
session:
expiration: 14 days
services:
router: App\RouterFactory::createRouter
extensions:
console: Kdyby\Console\DI\ConsoleExtension
events: Kdyby\Events\DI\EventsExtension
annotations: Kdyby\Annotations\DI\AnnotationsExtension
doctrine: Kdyby\Doctrine\DI\OrmExtension
doctrine:
metadata:
App: %appDir%
config.local.neon
doctrine:
user: root
password: root
dbname: notes
app\model\Article.php
namespace App;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
*/
class Article
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
*/
protected $id;
/**
* @ORM\Column(type="string")
*/
protected $title;
}
HomepagePresenter.php
namespace App\Presenters;
use App\Article;
use Nette;
class HomepagePresenter extends Nette\Application\UI\Presenter
{
/**
* @inject
* @var \Kdyby\Doctrine\EntityManager
*/
public $EntityManager;
private $dao;
public function renderDefault()
{
$this->template->articles = $this->dao;
}
public function actionDefault()
{
$dao = $this->EntityManager->getRepository(Article::class);
dump($dao->findAll());
$this->dao = $dao->findAll();
}
}
Až sem mi to funguje, dump vypíše seznam všech záznamů z databáze.
Super.
Ale ve chvíli, kdy přidám zobrazení záznamů do template
{foreach $articles as $article}
{$article->title}<br>
{/foreach}
vykoukne na mne chyba:
Cannot access protected property App\Article::$title
S uložením záznamu do db je ještě horší , tam začne řvát už IDE, pokud do actionDefault pridam:
$article = new Article();
$article->title = "The Tigger Movie";
$EntityManager->persist($article); // start managing the entity
$EntityManager->flush(); // save it to the database
Nikde jsem nenašel funkční návod jak rozchodit Doctrine , pokud s Nette začínám a s doctrine jsem nikdy nepracoval. Poradíte mi prosím ?
- petr.jirous
- Člen | 128
ty properties mas protected … takze bud pouzij gettery a settery, nebo extendni Nette\Object případně traitu SmartObject
- BigCharlie
- Člen | 283
Tohle nemá s Doctrine nic moc společného.
Na entitě nemáš definované žádné gettery, ani settery. Id, a
title jsou definovány jako protected (a dokonce je nejspíš chceš
mít jako private
), tudíž zvenčí nejsou vidět.
Takže buď vytvoříš gettery a settery, nebo nějaké public metody, přes které ty data budeš získávat:
class Article
{
// ... tvůj stávající kód
public function getTitle() {
return $this->title;
}
public function setTitle($value) {
$this->title = $value;
}
Pro výpis pak v šabloně použiješ $article->getTitle()
,
u ukládání $article->setTitle('změněný název')
.
Další varianta je, že použiješ traitu Nette\SmartObject
,
která ti do entity doplní „magii“ a budeš to moci používat bez setterů
a getterů.
edit: Heh, druhý v Chuchli :)
Editoval BigCharlie (27. 1. 2017 14:45)
- andros
- Člen | 145
Pokud bych chtěl jít cestou extend Nette\Object, bude to vypadat nějak takto:
namespace App;
use Doctrine\ORM\Mapping as ORM;
use Nette ;
/**
* @ORM\Entity
*/
class Article extends Nette\Object
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue
*/
protected $id;
/**
* @ORM\Column(type="string")
*/
protected $title;
}
Někde mám ještě chybu, protože dostávám chybu:
Cannot read an undeclared property App\Article::$title
- Oli
- Člen | 1215
Jeste zkus pouzit traitu MagicAccessor.
Kazdopadne, tohle je pro rychlé prototypovani, když ještě nevíš jak bude přesně struktura. Až to vědět budeš měl by sis napst setry a getry na to…