Spojení Nette a Doctrine krok za krokem

28.09.2016| Petr Fidler

Spojení Nette a Doctrine2 je velmi jednoduché díky knihovně Kdyby/Doctrine. V tomto článku popíšu návod krok za krokem a připravím tak půdu pro další díly seriálu.

Nejdříve si vytvoříme nový Nette projekt a přidáme balíčky z Kdyby:

    composer create-project nette/web-project
    composer require kdyby/doctrine
    composer require kdyby/events

Přidáme konfiguraci do config.neon:

    extensions:
        console: Kdyby\Console\DI\ConsoleExtension
        events: Kdyby\Events\DI\EventsExtension
        annotations: Kdyby\Annotations\DI\AnnotationsExtension
        doctrine: Kdyby\Doctrine\DI\OrmExtension

A v config.local přidáme přístupy do databáza:

    doctrine:
        user: user
        password: password
        dbname: Doctrine-translations
        host: localhost

Připravíme si entitu v app/ArticleModule/Entity/Article.php

    namespace ArticleModule\Entity;

    use Doctrine\ORM\Mapping as ORM;
    use Kdyby\Doctrine\Entities\Attributes\Identifier;

    /**
     * @ORM\Entity
     * @ORM\Table(name="article")
     */
    class Article
    {
        use Identifier;

        /**
         * @ORM\Column(type="string", nullable=true)
         * @var string
         */
        private $name;

        /**
         * @return string
         */
        public function getName()
        {
            return $this->name;
        }

        /**
         * @param string $name
         */
        public function setName($name)
        {
            $this->name = $name;
        }

    }

Pokud nyní pustíme v konzoli příkaz na update databáze a dostaneme SQL dotaz. (U reálného projektu doporučuji použít migrace):

    php www/index.php o:s:u --dump-sql
    CREATE TABLE article (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;

Vytvoříme si třídu app/ArticleModule/Service/ArticleService.php pro práci s entitou (v reálné aplikaci dostaneme data samozřejmě z formuláře či jiné služby):

    namespace ArticleModule\Service;

    use ArticleModule\Entity\Article;
    use Kdyby\Doctrine\EntityManager;

    class ArticleService
    {

        /**
         * @var EntityManager
         */
        private $entityManager;

        public function __construct(EntityManager $entityManager)
        {
            $this->entityManager = $entityManager;
        }

        public function createArticle()
        {
            $article = new Article;
            $article->setName('Name of article');
            $this->entityManager->persist($article);
            $this->entityManager->flush();
        }

    }

Zaregistrujeme ji v config.neon

services:
    - ArticleModule\Service\ArticleService

Můžeme třídu injectnout do presenteru a vytvořit článek:

namespace App\Presenters;

use ArticleModule\Service\ArticleService;
use Nette;

class HomepagePresenter extends Nette\Application\UI\Presenter
{

    /** @var ArticleService @inject */
    public $articleService;

    public function actionDefault()
    {
        $this->articleService->createArticle();
    }

}

Spojit Nette s Doctrine2 je velmi jednoduché. Celý příklad najdete na GitHubu - jako první commit.

Další články:

Zaujal tě článek a chceš ho nasdílet?