Nette 2 + Doctrine 2 + console

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

Zdravím, chtěl bych se zeptat, zda by někdo mohl napsat možný postup implementace nejnovějšího nette a nejnovější doctrine.
Můj pokus vypadá následovně:

config.neon:

common:
	parameters:
		doctrine:
			connection:
				driver: pdo_mysql
				host: localhost
				dbname: dbname
				user: root
				password:
			modelDir: "%appDir%/models"
			proxyDir: "%appDir%/proxies"
			proxyNamespace: Proxies
			autoGenerateProxyClasses: true

	php:
		date.timezone: Europe/Prague
		# session.save_path: "%tempDir%/sessions"
		# zlib.output_compression: yes


	nette:
		session:
			autoStart: true  # výchozí je false
			expiration: '+ 14 days'

		database:
			default:
				# dsn: '%database.driver%:host=%database.host%;dbname=%database.dbname%'
				# user: %database.user%
				# password: %database.password%


	services:
		doctrine:
			class: InitDoctrine( %doctrine% )

		# authenticator: Authenticator( @database::table(users) )


	factories:


production < common:

development < common:

InitDoctrine.php:

<?php

use \Doctrine\ORM\Configuration,
    \Doctrine\Common\Cache\ArrayCache,
    \Doctrine\ORM\EntityManager;

class InitDoctrine {

    public function __construct($options) {
        $config = new Configuration;
        $cache = new ArrayCache;
        $driverImpl = $config->newDefaultAnnotationDriver($options['modelDir']);

        $config->setMetadataCacheImpl($cache);
        $config->setQueryCacheImpl($cache);
        $config->setProxyDir($options['proxyDir']);
        $config->setProxyNamespace($options['proxyNamespace']);
        $config->setAutoGenerateProxyClasses($options['autoGenerateProxyClasses']);
        $config->setMetadataDriverImpl($driverImpl);

        $em = EntityManager::create($options['connection'], $config);

        return $em;
    }

}

Nevím zda je to správný směr implementace či ne, každopádně nevím, jak k tomu rozchodit i konzoli.
Pokud to jde, tak se mi to nechce natvrdo házet do bootstrapu nebo podobné, rád bych aby to bylo co možná nejméně závislé, spíše jako nějaký addon.

  • jako bonus by bylo nejlepší, kdyby se doctrina volala opravdu jen když je potřeba

// nejedná se mi o implementaci v nějakém nadframeworku, těch jsem tu viděl dost, ovšem pokud bych to chtěl použít musím už použít i daný nadframework
Děkuji za pomoc

Editoval Jack06 (24. 5. 2012 22:22)

Acnnair
Člen | 34
+
0
-

To čo hľadáš je napríklad extension od Patrika Votočka. Splňuje všetko to, čo by si potreboval. Máš tam konzolu, doctrine sa volá iba keď ju je potreba, je to ako extension do Nette. Čo sa týka toho nadframeworku, tak samozrejme nepotrebuješ celú Nellu, iba samotný plugin (ten už obsahuje všetko čo potrebuje) + Doctrine knižnice. Pre konzolu je ešte potrebná Symfony\Component\Console. Ako voliteľný bonus si k tomu môžeš dať aj migrácie.

Inak na inštaláciu všetkých závislostí (ale napríklad aj samotného pluginu) odporúčam použiť composer. O všetko sa postará a ty už iba používaš.

bojovyletoun
Člen | 667
+
0
-

ještě jeden detail: return v konstruktoru nemá význam

Jack06
Člen | 168
+
0
-

To od patrika jsem zkoušel rozchodit ale zaboha se mi to nepodařilo. Nevím zda je někde nějaký dobrý návod na to jak to použít step by stem mimo jeho nellu.

Jack06
Člen | 168
+
0
-

No to mi právě nešlo, chci rozjet konzoli a to mi nejde.

//ještě jsem nezkoušel teda přímo sandbox, tak vyzkouším ještě ten
// + jak tedy pak v cmd spustím doctrine console?? u symfony jako takové to spouštím přes soubor console.php jako php console, kde je tady nějaký takový či jak se to spouští zde?

Editoval Jack06 (25. 5. 2012 14:40)

Acnnair
Člen | 34
+
0
-

php index.php orm:chema-tool:create atď.

Patrik Votoček
Člen | 2221
+
0
-
<?php
define('nejde');

exec('php www/index.php orm:chema-tool:create');
Jack06
Člen | 168
+
0
-

super díky

Jack06
Člen | 168
+
0
-

Nevíte, proč by mi mohla ještě příkazová řádka hlásit toto:
ERROR: the server encountered an internal error and was unable to complete your request.

Když si dám php index.php tak mi vypíše všechny možnosti doctriny, ale když kteroukoli z těch možností zkusím, tak mi to vyhodí tuto vnitřní chybu a nějak nevím proč

Děkuji

Nox
Člen | 378
+
0
-

No a co je v logu?

Jack06
Člen | 168
+
0
-

aha, to mi nedošlo, že si console zapíše log, díky :-) ze symfony na to nejsem zvyklej takto, tam se to vypisovalo do console přímo

The annotation „@OneToMany" in property Resources::$children was never imported. Did you maybe forget to add a "use“ statement for this annotation?

<?php

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 *
 */
class Resources extends \Nette\Object {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     * @var int
     */
    private $id;

    /**
     * @OneToMany(targetEntity="Resources", mappedBy="parent")
     */
    private $children;

    /**
     * @ManyToOne(targetEntity="Resources", inversedBy="children")
     * @JoinColumn(name="parent_id", referencedColumnName="id")
     */
    private $parent;

    /**
     * @ORM\Column(unique=true)
     * @var string
     */
    private $key;

    /**
     * @ORM\Column
     * @var string
     */
    private $name;

    /**
     * @ORM\Column
     * @var string
     */
    private $comment;

}

zkouším podle návodu a vyhodilo mi to toto no :-D Nechápu

http://docs.doctrine-project.org/…mapping.html#…

//beru zpět, cache

nicméně co udělat, aby mi to nepsalo: No Metadata Classes to process. na localu ?

dodám ještě, že jsem v config.neon přidal useAnnotationNamespace: true

Editoval Jack06 (30. 5. 2012 14:28)

Patrik Votoček
Člen | 2221
+
0
-

pokud používáš useAnnotationNamespace: true tak musíš anotace psát jako @OneToMany a né jako @ORM\OneToMany. Jinak mě ještě napadá máš správně nastavené entityDirs?

Jack06
Člen | 168
+
0
-

No když dám pryč z neonu to useAnnotationNamespace, tak to zahlásí :

The annotation "@OneToMany" in property Resources::$children was never imported. Did you maybe forget to add a "use" statement for this annotation?

Tak žebych to musel mít zapnuté a psát to všude bez ORM?

//trochu mimo, teď koukám že používám @OneToMany bez orm :-)

Editoval Jack06 (30. 5. 2012 16:06)

Acnnair
Člen | 34
+
0
-

Pri useAnnotationNamespace: true používaj iba @Column, @OneToMany, @HocijakaAnotaciaZDoctrine.

Keď to tam nemáš, tak sa použije importovaná namespace z php, ako máš teraz hore

<?php
use Doctrine\ORM\Mapping as ORM;
?>

a musíš teda všade písať @ORM\Column, @ORM\OneToMany, @ORM\HocijakaAnotaciaZDoctrine.

Editoval Acnnair (30. 5. 2012 16:12)

Patrik Votoček
Člen | 2221
+
0
-

Buďto to máš máš zapnuté (useAnnotationNamespace: true) a používáš:

/**
 * @Entity
 */
class Resources extends \Nette\Object
{}

Nebo to máš vypnuté a používáš:

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Resources extends \Nette\Object
{}