Kdyby/Doctrine jak na to – základy + zprovoznění
- motorcb
- Člen | 552
Zdravím. Chtěl bych se naučit Doctrine.
Stáhl jsem si sandbox (Nette 2.1), upravil composer:
"require": {
"php": ">= 5.3.0",
"nette/nette": "~2.1.0",
"kdyby/doctrine": "@dev",
"kdyby/annotations": "@dev",
"kdyby/doctrine-cache": "@dev",
"kdyby/events": "@dev",
"kdyby/console": "@dev"
},
provedl composer install
Nastavil neon:
parameters:
doctrine:
user: root
password:
dbname: sandbox
metadata:
App: %appDir%
...
services:
- Model\UserManager
- App\RouterFactory
router: @App\RouterFactory::createRouter
console: Kdyby\Console\DI\ConsoleExtension
events: Kdyby\Events\DI\EventsExtension
annotations: Kdyby\Annotations\DI\AnnotationsExtension
doctrine: Kdyby\Doctrine\DI\OrmExtension
V MySQL mám tabulku article.
Vytvořil základní třídu:
use Doctrine\ORM\Mapping as ORM;
/** @ORM\Entity() */
class Article extends \Kdyby\Doctrine\Entities\IdentifiedEntity
{
/** @ORM\Column(type="string") */
protected $title;
}
proč mi nefunguje tento příkaz php www/index.php \
orm:validate? Používám W7.
Příkaz vypíše titulní stránku :-(
D:\www\nette>php www/index.php \ orm:validate
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="description" content="">
<title>NETTE APPLICATION SKELETON</title>
<link rel="stylesheet" media="screen,projection,tv" href="/css/screen.cs
s">
<link rel="stylesheet" media="print" href="/css/print.css">
<link rel="shortcut icon" href="/favicon.ico">
</head>
<body>
<script> document.documentElement.className+=' js' </script>
nette
<script src="/js/jquery.js"></script>
<script src="/js/netteForms.js"></script>
<script src="/js/main.js"></script>
</body>
</html>
A co dál? Jak získám v presenteru EntitiyManager? Jak udělám výpis všech záznamů z tabulky Article?
Děkuji za rady a nakupnutí
Editoval motorcb (31. 1. 2014 17:32)
- Tomáš Votruba
- Moderator | 1114
Ahoj, doporučuji přečíst Doctrine a service vrstva aneb takto mi to dává smysl, kde najdeš několik odpovědí na své otázky.
- Pavel Kouřil
- Člen | 128
console: Kdyby\Console\DI\ConsoleExtension
events: Kdyby\Events\DI\EventsExtension
annotations: Kdyby\Annotations\DI\AnnotationsExtension
doctrine: Kdyby\Doctrine\DI\OrmExtension
Nepatří do sekce „services“, ale do sekce „extensions“. Doporučuji přečíst https://github.com/…/en/index.md, nejspíš ti to základní otázky zodpoví, pak se klidně poptej dál. :)
- motorcb
- Člen | 552
@Pajka: Paráda, díky.
php www/index.php \ orm:validate Mi již funguje.
Article.php:
namespace App;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
*/
class Article extends \Kdyby\Doctrine\Entities\IdentifiedEntity
{
/**
* @ORM\Column(type="string")
*/
protected $title;
}
Jak si v prezenteru sáhnu na EntityManager
$articles = $entityManager->getDao(App\Article::getClassName());
Když přidám do config.neon:
services:
articles: App\Articles(@doctrine.dao(App\Article))
Laděnka hlásí chybu:
Argument 2 passed to Nette\DI\Compiler::addExtension() must be an
instance of Nette\DI\CompilerExtension, instance of stdClass given, called in
D:\www\nette\vendor\nette\nette\Nette\DI\Extensions\ExtensionsExtension.php on
line 24 and defined
Co teď?
- Pavel Kouřil
- Člen | 128
Podle toho, jak je „zadefinována“ v configu, tak to bude něco takového:
namespace App;
use Kdyby\Doctrine\EntityDao;
class Articles
{
/**
* @var EntityDao
*/
private $articleDao;
public function __construct(EntityDao $articleDao)
{
$this->articleDao = $articleDao;
}
// + další metody, které pravděpodobně budou pracovat s articleDao ... a jejich implementace a podoba je jen a jen na tobě :)
}
Editoval Pajka (1. 2. 2014 0:34)
- Tomáš Kolinger
- Člen | 136
Máš service třídu a chceš mít v presenteru EntityManager? Proč? Service třída existuje právě proto, aby zavolala DAO/EntityManager „za tebe“. Takže si implementuj metodu něco jako Articles->findAll() a tam vytvoř dotaz. Potom si Articles nech předat do presenteru a je to :)
Editoval Tomáš Kolinger (1. 2. 2014 10:03)
- motorcb
- Člen | 552
@Tomáš Kolinger: skvělé. Funguje.
Jen mám nyní ještě problém. Přidal jsem do databáze novou tabulku category
Upravil jsem kód aby mohl pracovat s touto novou tabulkou a Nette mi
hlásí chybu:
Class „App\Categorys“ is not a valid entity or mapped
super class.
Totu tabulku je nutné namapovat na objekt je to tak?
Jakým příkazem namapuju tabulku na objekt?
Děkuji
- Skippous
- Člen | 21
Dle dokumentace se dají entity generovat. Kdyby to ale zřejmě nepodporuje,
nebo mi to alespoň příkaz nenabízí. Máte s tím někdo zkušenosti?
http://docs.doctrine-project.org/…e/tools.html#….
- Filip Procházka
- Moderator | 4668
Můžeš si ho zaregistrovat a spustit sám :) Kdyby ničemu takovému nebrání.
services:
- {class: Doctrine\ORM\Tools\Console\Command\GenerateEntitiesCommand, tags: [kdyby.console.command]}
- Filip Procházka
- Moderator | 4668
Rozhodně nechceš pouštět přímo SQLka z console, to
update --force
je hodně nebezpečný, lepší je pouštět to s
--dump-sql
, vygenerované příkazy si projít a
pouštět ručně.
- besir
- Člen | 170
Service ‚doctrine.cacheCleaner‘: Service of type Kdyby\Doctrine\EntityManager needed by Kdyby\Doctrine\Tools\CacheCleaner::__construct() not found. Did you register it in configuration file?
config.neon
extensions:
console: Kdyby\Console\DI\ConsoleExtension
events: Kdyby\Events\DI\EventsExtension
annotations: Kdyby\Annotations\DI\AnnotationsExtension
doctrine: Kdyby\Doctrine\DI\OrmExtension
console:
url: http://www.myurl.cz
annotations:
ignore:
- anyannottion
debug: yes
...
instalováno přes composer
{
"name": "406coupe.cz",
"description": "",
"homepage": "http://406coupe.cz",
"type": "project",
"license": ["Unlicense"],
"authors": [
{
"name": "David Grudl",
"homepage": "http://davidgrudl.com"
},
{
"name": "Nette Community",
"homepage": "https://nette.org/en/contributors?lang=en"
}
],
"require": {
"php": ">= 5.3.7",
"nette/nette": "~2.2.0",
"kdyby/doctrine": ">=2.1.0"
},
"require-dev": {
"nette/tester": "~1.0"
},
"minimum-stability": "stable"
}
v installed.json jsem nenašel Kdyby\\Doctrine\\EntityManager, ale ve vendor/.. jsem třídu našel…
Nějaký nápad? :-/
Editoval besir (19. 9. 2014 23:35)