Kdyby/Doctrine jak na to – základy + zprovoznění

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

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

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.

motorcb
Člen | 552
+
0
-

@Tomáš Votruba:
Díky za reakci. Z článku mi stále není jasné jak vytvořit EntityManager a proč mi nefunguje příkaz do konzole :-(

Pavel Kouřil
Člen | 128
+
0
-
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
+
0
-

@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ď?

stekycz
Člen | 152
+
0
-

To vypadá hodně podezřele, nesnažíš se někde vytvořit vlastní CompilerExtension nějakým hodně zvláštním způsobem?

motorcb
Člen | 552
+
0
-

@stekycz:
Máte pravdu :-) Stále si pletu services a extensions
Musí to být zapsané v services

Class App\Articles used in service ‚articles‘ has not been found or is not instantiable.

Jak by měla vypadat třída articles???

Díky

Pavel Kouřil
Člen | 128
+
0
-

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)

motorcb
Člen | 552
+
0
-

@Pajka: SUper, povedlo se, žádná chyba :-)

Jak ted v prezenteru získám entityManager ???

$articles = $entityManager->getDao(App\Article::getClassName());

Abych mohl vypsat všechny záznamy z tabulky article?

Tomáš Kolinger
Člen | 136
+
0
-

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

@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

motorcb
Člen | 552
+
0
-

@nobody.guy: díky ale to vypadá na mapování opačným směrem. Já mám tabulky pevně definované a jen se k nim chci připojit

cubic
Člen | 45
+
0
-

@motorcb: V tom případě musíš jít přesně opačně a vytvořit entity přesně podle existujících tabulek. Doporučený postup to ale rozhodně není…

Skippous
Člen | 21
+
0
-

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

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]}
cubic
Člen | 45
+
0
-

@Skippous: z příkazového řádku můžeš entity vygenerovat pomocí:

php www/index.php orm:schema:create

a nebo aktualizovat:

php www/index.php orm:schema:update --force

Filip Procházka
Moderator | 4668
+
0
-

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ě.

cubic
Člen | 45
+
0
-

Předpokládal jsem, že se dotaz vztahuje na development mode.

besir
Člen | 170
+
0
-

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)

besir
Člen | 170
+
0
-

Shit…
chybelo mi v config.neon

doctrine:
	host: 'host'
	user: 'root'
	password: ''
	dbname: '406coupe'
	metadata:
		App: %appDir%

a takhle nehezky to umrelo