Case mismatch on class name po přechodu na Nette 2.3
- BuMoRi
- Člen | 109
Ahoj, snažím se jednu aplikaci postavenou na 2.0 postupně migrovat na
novější verze Nette.
Ve verzi 2.3 jsou nově presentery a routy case sensitive.
Mám takovouto strukturu:
app
adminModule
model
presenters
templates
phonesModule
portalModule
Názvy presenteru:
homePresenter.php
Obsah presenterů:
namespace portalModule;
class homePresenter {}
Routa:
$container->router[] = new Route('<module=index>/<presenter=index>/<action=default>/<id=>', array(), Route::SECURED);
V configu není uvedeno mapování, takže předpokládám, že se
používá nějaké výchozí.
Do verze 2.2 vše OK, nyní chyba:
User Warning
Case mismatch on class name 'PortalModule\HomePresenter', correct name is 'portalModule\homePresenter'
Čím vlastně vzniká tato chyba, když mám ve skutečnosti vše malym písmem…
- kocourPB
- Člen | 47
Ahoj, co presne mas nastavene v app/config/config.neon ? Napr ja mam nieco taketo:
application:
mapping:
*: SandboxProject\*Module\Presenters\*Presenter
Inak namespacy modulov a classy presenterov by som odporucal pomenovat s velkymi zaciatnocnymi pismenami napr: HomePresenter, PortalModule atd.
napr:
namespace SandboxProject\PortalModule\Presenters;
class HomePresenter {
// ...
}
Editoval kocourPB (30. 4. 2019 13:02)
- David Matějka
- Moderator | 6445
ahoj, musel bys upravit filtry na routě pro presenter parametr, aby to převádělo na tvé názvy. ale jak píše @kocourPB – bude lepší, když přejmenuješ ty třídy a ns
- BuMoRi
- Člen | 109
Díky za reakci.
Jak už jsem psal, mapping v configu není vůbec.
S velkými písmeny souhlasim a na nový projektech to tak dělám. Tento
starý je holt napsaný takto a má spoustu modulů a presenterů, takže bych
to rád vyřešil bez přepsání začátečních písmen…
Edit: reagoval jsem jen na kocoura. S těma filtrama by to teda šlo? Přiznám
se že vůbec netuším, jak by se to udělalo…
Editoval BuMoRi (30. 4. 2019 13:46)
- David Matějka
- Moderator | 6445
@BuMoRi pro jednotlive parametry v route muzes definovat FILTER_IN a FILTER_OUT funkce, ktery jej transformuji mezi URL hodnotou a hodnotou aplikacniho requestu, viz https://doc.nette.org/…tion/routing#…
pro presenter a module existuji defaultni filtry presenter2path a path2presenter, viz https://github.com/…rs/Route.php, takze muzes u rout definovat vlastni filtry
- BuMoRi
- Člen | 109
Ahoj, takže podle rady Davida jsem to udělal takto:
<?php
$router[] = new Route('<module=index>/<presenter=index>/<action=default>/<id=>', array(
'module' => array(
Route::FILTER_IN => function ($module) {
$module = preg_replace('#([.-])(?=[a-z])#', '$1 ', $module);
//$module = ucwords($module);
$module = str_replace('. ', ':', $module);
$module = str_replace('- ', '', $module);
return $module;
},
),
'presenter' => array(
Route::FILTER_IN => function ($presenter) {
$presenter = preg_replace('#([.-])(?=[a-z])#', '$1 ', $presenter);
//$presenter = ucwords($presenter);
$presenter = str_replace('. ', ':', $presenter);
$presenter = str_replace('- ', '', $presenter);
return $presenter;
},
),
), Route::SECURED);
?>
Je to takto OK? Jde mi o to, abych mohl ponechat malá písmena na začátku
presenterů, tříd a modulů.
A ještě otázka: samostatné komponenty (např. formuláře, renderery apod)
by to ovlivnit nemělo, že? Ty mi totiž nefungují (Call to undefined
method).