Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
paranoiq opened this Issue Aug 5, 2013 · 11 comments

Comments

Projects
None yet
4 participants
@paranoiq
Copy link

paranoiq commented Aug 5, 2013

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 composer/composer#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

@PetrP

This comment has been minimized.

Copy link
Owner

PetrP commented Aug 6, 2013

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

This comment has been minimized.

Copy link
Owner

PetrP commented Aug 6, 2013

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

This comment has been minimized.

Copy link
Owner

PetrP commented Aug 6, 2013

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

This comment has been minimized.

Copy link
Owner

PetrP commented Aug 6, 2013

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

@paranoiq

This comment has been minimized.

Copy link
Author

paranoiq commented Aug 7, 2013

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: Clevis@d6feb27 (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

@JanTvrdik

This comment has been minimized.

Copy link
Contributor

JanTvrdik commented Aug 7, 2013

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

@paranoiq

This comment has been minimized.

Copy link
Author

paranoiq commented Aug 7, 2013

@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

This comment has been minimized.

Copy link
Author

paranoiq commented Aug 8, 2013

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

This comment has been minimized.

Copy link
Author

paranoiq commented Sep 6, 2013

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

@Mikulas

This comment has been minimized.

Copy link

Mikulas commented Feb 6, 2015

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

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

@JanTvrdik

This comment has been minimized.

Copy link
Contributor

JanTvrdik commented Feb 26, 2016

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.