Nettrine ORM – Vypnutí generování proxies tříd

RePRO
Člen | 32
+
0
-

Zdravím,

je možné nějak nastavit, aby se automaticky negenerovaly proxies?

Nastavili jsme v konfiguraci:

nettrine.orm:
    configuration:
       autoGenerateProxyClasses: ::constant(Doctrine\Common\Proxy\AbstractProxyFactory::AUTOGENERATE_NEVER)

Jenže stále se generuje (i po tom, co odmažeme cache). Cílem je problematika lazy loadingu v tomto kontextu.

Děkuji předem za poznatky.

Felix
Nette Core | 1245
+
0
-

Takhle se to nastavuje spravne. Muzes to zkusim zdebugovat v DI containeru, jestli to probubla spravne?

RePRO
Člen | 32
+
0
-

Přes DI: nettrine.orm.configuration -> Doctrine\ORM\Configuration → klíč autoGenerateProxyClasses tam vůbec není. Zároveň jsem zakomentoval v konfigurátoru klíč #proxyDir: '%tempDir%/proxies' a ten se v DI ukazuje. Buď to nereaguje jak má, nebo si nedokáži vysvětlit, co to může přebíjet. Cache mažu pokaždé.

Editoval RePRO (27. 2. 2021 12:46)

Felix
Nette Core | 1245
+
0
-

V DI by jsi mel mit neco jako tohle.

public function createServiceNettrine__orm__configuration(): Doctrine\ORM\Configuration
{
	$service = new Doctrine\ORM\Configuration;
	$service->setProxyDir('{projectPath}/var/tmp/proxies');
	$service->setAutoGenerateProxyClasses(2);
	$service->setProxyNamespace('Nettrine\Proxy');
	$service->setMetadataDriverImpl($this->getService('nettrine.orm.mappingDriver'));
	$service->setCustomStringFunctions([]);
	$service->setCustomNumericFunctions([]);
	$service->setCustomDatetimeFunctions([]);
	$service->setCustomHydrationModes([]);
	$service->setNamingStrategy(new Doctrine\ORM\Mapping\UnderscoreNamingStrategy);
	$service->setEntityListenerResolver($this->getService('nettrine.orm.entityListenerResolver'));
	$service->setQueryCacheImpl($this->getService('nettrine.cache.driver'));
	$service->setHydrationCacheImpl($this->getService('nettrine.cache.driver'));
	$service->setResultCacheImpl($this->getService('nettrine.cache.driver'));
	$service->setMetadataCacheImpl($this->getService('nettrine.cache.driver'));
	$service->setSecondLevelCacheEnabled();
	$service->setSecondLevelCacheConfiguration($this->getService('nettrine.orm.cache.cacheConfiguration'));
	return $service;
}
RePRO
Člen | 32
+
0
-

$service->setAutoGenerateProxyClasses(2);

Tam prostě nemám. Viz.

public function createServiceNettrine__orm__configuration(): Doctrine\ORM\Configuration
{
	$service = new Doctrine\ORM\Configuration;
	$service->setProxyDir('...');
	$service->setProxyNamespace('Nettrine\Proxy');
	$service->setMetadataDriverImpl($this->getService('nettrine.orm.mappingDriver'));
	$service->setCustomStringFunctions([
		'JSON_EXTRACT' => 'Scienta\DoctrineJsonFunctions\Query\AST\Functions\Mysql\JsonExtract',
	]);
	$service->setCustomNumericFunctions([]);
	$service->setCustomDatetimeFunctions([]);
	$service->setCustomHydrationModes([]);
	$service->setNamingStrategy(new Doctrine\ORM\Mapping\UnderscoreNamingStrategy);
	$service->setEntityListenerResolver($this->getService('nettrine.orm.entityListenerResolver'));
	$service->setQueryCacheImpl($this->getService('nettrine.cache.driver'));
	$service->setHydrationCacheImpl($this->getService('nettrine.cache.driver'));
	$service->setResultCacheImpl($this->getService('nettrine.cache.driver'));
	$service->setMetadataCacheImpl($this->getService('nettrine.cache.driver'));
	$service->setSecondLevelCacheEnabled();
	$service->setSecondLevelCacheConfiguration($this->getService('nettrine.orm.cache.cacheConfiguration'));
	return $service;
}
RePRO
Člen | 32
+
0
-

Co se týče verzí, tak:

"nettrine/dbal": "^0.6"
"nettrine/orm": "^0.7"
RePRO
Člen | 32
+
0
-
nettrine.orm:
    configuration:
       autoGenerateProxyClasses: ::constant(Doctrine\Common\Proxy\AbstractProxyFactory::AUTOGENERATE_NEVER)

Na tuhle hodnotu to nereaguje – nejspíš to vypadá, že mám špatně namespace k té konstantě a podobně. Když tam nahodím boolean natvrdo:

Nastavíme true, tak už se nastaví $service->setAutoGenerateProxyClasses(2) jako tobě.

Akorát když nastavíme na false:

nettrine.orm:
    configuration:
       autoGenerateProxyClasses: false
require(... proxies\__CG__AppModelEntita.php): failed to open stream: No such file or directory

Tak se to snaží otevřít tu proxinu, která neexistuje a spadne to. Možná jsem to taky špatně pochopil, když se to vypne úplně, tak to bude do toho adresáře koukat a využívat nebo se pletu?

Editoval RePRO (27. 2. 2021 15:30)

RePRO
Člen | 32
+
0
-

Tak jsme nechali na true a do anotace přidali fetch na EAGER, což zabralo.

@ORM\ManyToOne(targetEntity="...", inversedBy="id", fetch="EAGER")

Každopádně děkuji za feedback.

Felix
Nette Core | 1245
+
0
-

@RePRO Tak covece, nedalo mi to a prozkoumal jsem to. Byl tam bug, kdyz jsi to zadal jako bool/int tak to fungovalo skvele. Ale ten tvuj zapis autoGenerateProxyClasses: ::constant(Doctrine\Common\Proxy\AbstractProxyFactory::AUTOGENERATE_NEVER) nefungoval. xD

Opravil jsem to (https://github.com/…/orm/pull/90).

Zkus prosim dev-master.


Btw, vymyslel jsem u toho skvelou vec, takze diky za report a diky za inspiraci. :-D

RePRO
Člen | 32
+
0
-

Felix napsal(a):

@RePRO Tak covece, nedalo mi to a prozkoumal jsem to. Byl tam bug, kdyz jsi to zadal jako bool/int tak to fungovalo skvele. Ale ten tvuj zapis autoGenerateProxyClasses: ::constant(Doctrine\Common\Proxy\AbstractProxyFactory::AUTOGENERATE_NEVER) nefungoval. xD

Opravil jsem to (https://github.com/…/orm/pull/90).

Zkus prosim dev-master.


Btw, vymyslel jsem u toho skvelou vec, takze diky za report a diky za inspiraci. :-D

Jop, frčí to, pecka.
Taky se mi občas stalo, že jakýkoliv bug mi otevřel vrátka ještě lepším směrem v určité problematice :-)

Díkec :)

Michal Palounek
Člen | 2
+
0
-

Zdravím,
řeším úplně stejnou věc jako RePRO v prvním komentáři. Mam stejnou konfiguraci v neonu a v composer mam:

nettrine/orm": "^0.8.4",
"nettrine/dbal": "^0.8.2",
"nettrine/migrations": "^0.9.1",
"nettrine/fixtures": "^0.7.2"

A hlásí mi to přesně tu samou chybu:

require(...temp//proxies/__CG__AppModelDatabaseDoctrineEntityEnumerationItem.php): Failed to open stream: No such file or directory
Pepino
Člen | 257
+
0
-

@MichalPalounek A vygeneroval jsi ty proxy třídy?

Michal Palounek
Člen | 2
+
0
-

nn potřebuju vypnout generování proxy na develu – jde to vůbec?

Pepino
Člen | 257
+
0
-

Michal Palounek napsal(a):

nn potřebuju vypnout generování proxy na develu – jde to vůbec?

Když vypneš automatické generování proxy tříd tak je musíš vygenerovat manuálně.