Jak začít používat Doctrine v Nette Framework

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

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
+
0
-

ty properties mas protected … takze bud pouzij gettery a settery, nebo extendni Nette\Object případně traitu SmartObject

BigCharlie
Člen | 283
+
0
-

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
+
0
-

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
+
+1
-

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…