Case mismatch on class name po přechodu na Nette 2.3

BuMoRi
Člen | 109
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)

BuMoRi
Člen | 109
+
0
-

Zkusil jsem zkušebně přejmenovat třídy a NS v jenom modulu. Dostávám: Case mismatch on presenter name ‚Portal:home‘, correct name is ‚Portal:Home‘.
Tohle tedy znamená že např. $this->redirect(‚:Portal:home:‘); musím všude změnit na $this->redirect(‚:Portal:Home:‘);?

David Matějka
Moderator | 6445
+
0
-

@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
+
0
-

Jen připomínám, že jde o verzi 2.3, ale tam je to asi podobné.
Obávám se ale, že bych to dohromady nedal. Pokud bych se rozhod vše přejmenovat, musim tedy přejmenovávat i ty odkazy? (viz předchozí příspěvek)

David Matějka
Moderator | 6445
+
0
-

ano, i odkazy

BuMoRi
Člen | 109
+
0
-

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).