Orm icon indicating copy to clipboard operation
Orm copied to clipboard

nenormalizovat jména tříd na malá písmena

Open paranoiq opened this issue 11 years ago • 11 comments

metoda RepositoryHelper::normalizeRepository() překládá jména tříd na malá písmena. to způsobuje, že:

  1. ORM nemůže na operačních systémech s case sensitive filesystémem načíst třídy repozitářů/entit atp. pokud autoloader používá PSR-0 (přímé mapování namespaců na adresáře). to z principu nelze řešit jinak, než že ORM bude vyžadovat správné jméno třídy včetně velikosti znaků

  2. vzhledem, že Composer zamítl bug https://github.com/composer/composer/issues/1803 (čemuž se nelze divit. bylo by hloupé, kdyby se classmap autoloader choval jinak než PSR-0 autoloader), nelze vůbec načíst jakékoliv repository/entity nainstalované Composerem

nevím jestli podobná normalizace není ještě někde

paranoiq avatar Aug 05 '13 22:08 paranoiq

Já tomu nerozumím. RepositoryHelper::normalizeRepository nevrací název žádné třídy. Jak může string který se vytváří z jména třídy repository a používá se jako defaultní název tabulky nějak souviset z načítáním tříd?

Kdyby jsi podle tohodle stringu snažil se načíst třídu tak dříve než na problém z velikostí písmen tak naraziš na to že to z repository class name, odstranuje z konce slovo repository.

PetrP avatar Aug 06 '13 09:08 PetrP

Aha tak se jedná o to že se z tohodle jména háda defaultní entity name.

PHP třídy jsou case insensitive a používat autoloader který to nerespektuje, je hlavně bug toho autoloadu.

A ano podobný "problém" je na více místech.

  • Typy v anotacích.
  • Defaultní název mapperu.
  • Defaultní název entity.
  • Kontrolování integrity metadat v entitách.
  • Načítání (bez aliasů) repository z repositorycontaineru.
  • A možná i další.

Aby to všechno fungovalo caseinsensitivně by bylo o dost komplikovanější a pomalejší. Takže spíš to "opravím" jen na místech kde nelze přepsat chování.

Ale rozhodně ti nedoporučuju používat case sensitiivní class loader na case insensitivní php třídy.

PetrP avatar Aug 06 '13 10:08 PetrP

Teď když jsem si dal kafe, osprchoval se a trochu více se probudil. :-) Tak uznávám že to je problém, který bych měl řešit. Realita je taková že tyhle class loadery se takhle debilně chovají a já s tím musím fungovat, protože jsou lidi kteří je používají. (Ale doporučuju začít používat Nette\Loaders\RobotLoader.)

PetrP avatar Aug 06 '13 10:08 PetrP

Btw. díky za bug report. :-)

PetrP avatar Aug 06 '13 10:08 PetrP

ad "PHP třídy jsou case insensitive a používat autoloader který to nerespektuje, je hlavně bug toho autoloadu." - by mě opravdu zajímalo, jak by to měl řešit PSR-0 autoloader na case sensitive filesystému? zkoušet všechny kombinace malých a velkých písmen? :] to že jsou třídy case insensitive je především chyba v návrhu PHP. možná bych to měl reportovat jako bug : P

fix: https://github.com/Clevis/Orm/commit/d6feb270cff3ec7c1d1c6ee1231ad721bc1f1eb0 (ještě to musím prověřit v reálu a nejspíš to nepokrývá všechny oblasti co jsi vypsal)

Nette RobotLoader by to řešil, ale problém při použití PSR-0 zůstává a konfigurace jiného loaderu při načítání Composerem je zbytečná práce navíc a při opomenutí zbytečná WTF. chce to odstranit příčinu

paranoiq avatar Aug 07 '13 07:08 paranoiq

@paranoiq BTW: PSR-0 nedoporučuje ani Composer. Kvůli rychlosti stejně doporučují vygenerovat classmapu = to, co dělá RobotLoader.

JanTvrdik avatar Aug 07 '13 07:08 JanTvrdik

@PetrP na základní aplikaci s jednou Entitou, Repository a Mapperem to funguje. ještě to musím ověřit na něčem větším, kde jsou vazby atd. je možné že bude problém s těmi anotacemi. testy samozřejmě prochází

paranoiq avatar Aug 07 '13 19:08 paranoiq

další problém nejspíš bude v RelationshipMetaData::checkIntegrity(). pokusím se to vyřešit

UPDATE: kontrola integrity funguje tak jak je. není třeba to upravovat. otestoval jsem to i s relacemi a zatím jsem na žádnou chybu nenarazil

paranoiq avatar Aug 08 '13 19:08 paranoiq

@JanTvrdik teď jsem zjistil, že i classmap v Composeru je case-sensitive

paranoiq avatar Sep 06 '13 16:09 paranoiq

Rád bych znovu oživil toto téma.

Nette 2.3.0-RC2 má commit https://github.com/nette/di/commit/63bda596dbbfd38f462d1b28b1e43e4af052c0e1 který z původního DI getteru dělá case sensitivní, takže normalizování tříd na lowercase nebude fungovat.

Mikulas avatar Feb 06 '15 18:02 Mikulas

Tohle je pořád problém, RobotLoader je už taky case-sensitive.

JanTvrdik avatar Feb 26 '16 06:02 JanTvrdik