Nette 2 + Doctrine 2 + console
- Jack06
- Člen | 168
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
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š.
- Jack06
- Člen | 168
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)
- Jack06
- Člen | 168
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
- Jack06
- Člen | 168
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
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
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
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
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
{}