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:
- Spojení Nette a Doctrine krok za krokem
- Překlad entit v Doctrine2