V produkci: Class XXX has not been found

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Jan Mikeš
Člen | 771
+
0
-

Zdravim, nevim si uz rady a nemuzu nikde najit chybu.

Na localu vse bezi tak jak ma, na produkci chyba ‚Class HG\Users has not been found.‘

Models\Users.php:

namespace HG;

/**
 * Model starající se o tabulku user
 */
class Users extends BaseModel
{
...
}

Config.neon:

	services:
		database: @Nette\Database\Connection

		users: HG\Users
		authenticator: HG\Authenticator
		sarze: HG\Sarze
		product: HG\Product

kdyz smazu sluzby users a authenticator (ktera je na users zavisla) tak to slape i na produkci. Vsechny modely mam v jedne slozce a vsechny maji stejnou definici, proc tedy zrovna konkretni tridu HG\Users robotloader nedokaze najit?

Tempy promazany X krat, beze zmeny. Uplne stejny model Users pouzivam ve 2 dalsich aplikacich a bez problemu, urcite se jedna o nejakou prkotinu kterou jsem prehledl…

Ot@s
Backer | 476
+
0
-

A není produkce náhodou widloidní hosting?

Jan Mikeš
Člen | 771
+
0
-

Neni prave, local mam W8 a produkce je linux. Nejde mi to do hlavy uz jen kvuli tomu ze naprosto shodna trida (pouze s jinym namespace) mi bezi bezproblemove jinde a dal kvuli tomu, ze robotloader nenajde pouze tuto jednu tridu i presto, ze soubor je umisten ve stejnem adresari jako ostatni modely.

Ot@s
Backer | 476
+
0
-

Lexi napsal(a):

Neni prave, local mam W8 a produkce je linux. Nejde mi to do hlavy uz jen kvuli tomu ze naprosto shodna trida (pouze s jinym namespace) mi bezi bezproblemove jinde a dal kvuli tomu, ze robotloader nenajde pouze tuto jednu tridu i presto, ze soubor je umisten ve stejnem adresari jako ostatni modely.

To už je jedno, kdo je kde. Důležité je to, že každý FS z různých OS může jinak přistupovat k názvům souborů/adresářů (mám tím na mysli ignoraci velkých/malých písmen u názvů souborů pod widlema). Zkontroluj si názvy souborů s třídama modelu (popř. celý prostor, kam pouštíš robotloader).

Edit: jestli nepoužíváš robotloader, zkotroluj include/require oproti skutečným názvům knihoven

Editoval Ot@s (11. 10. 2012 12:12)

Jan Mikeš
Člen | 771
+
0
-

Robotloader pouzivam.

Vsechny adresare jsou pojmenovane malymi pismeny a vsechny php soubory jsou pojmenovany takto: BaseModel.php, Users.php, Authenticator.php

vsechny modely jsou ve stejnem jmennem prostoru, lisi se pouze nazev tridym vzdy zacinajici velkym pismenem HG\Neco

Nechapu proc robotloader ignoruje pouze ten jeden soubor a zadny jiny, vyzkousim jeste primo require v bootstrapu a uvidim…

Ot@s
Backer | 476
+
0
-

Byl to jen tip. Víc z toho, co píšeš není možné vyčíst (alespoň pro mě). Ještě se podívej do temp/cache/_Nette.RobotLoader/* a pohledej tam frázi „HG\Users“ (jestli tam vůbec je a na jaký soubor je navázaná). Porovnej produkci i vyvoj.

Editoval Ot@s (11. 10. 2012 12:25)

Jan Mikeš
Člen | 771
+
0
-

„hg\users“;a:3:{s:4:„file“;s:87:„/mnt/data/accounts/h/helsinkigroup/data/www/helsinkigroup.cz/sarze/app/models/Users.php“;s:4:„time“;i:1349951231;s:4:„orig“;s:8:„HG\Users“;}

„hg\users“;a:3:{s:4:„file“;s:51:„C:\xampp\htdocs\helsinki-sarze\app\models\Users.php“;s:4:„time“;i:1349945402;s:4:„orig“;s:8:„HG\Users“;}

Cesta se zda byt v poradku :(

Jan Mikeš
Člen | 771
+
0
-
// Create Dependency Injection container from config.neon file
$configurator->addConfig(__DIR__ . '/config/config.neon');
require(__DIR__ . '/models/Users.php');
$container = $configurator->createContainer();

Po pridani require se aplikace rozjede :)) porad me ale zajima kde je chyba, toto neni totiz bezny postup…

Ot@s
Backer | 476
+
0
-

Hmmm, tak to Ti neporadím… Jedině jít přímo do kódů Nette a dumpovat proces autloadingu tříd.

Editoval Ot@s (11. 10. 2012 12:39)

Jan Mikeš
Člen | 771
+
0
-

Zahada je na svete, zkontroloval jsem prava (vsude byly 644), zkusil odmazat ten require, opetovne promazan temp a najednou to jede, nic jineho jsem nemenil… absolute nechapu

No, nejaka nevysvetlitelna sila,.. hlavni je ze uz to funguje.

Editoval Lexi (11. 10. 2012 12:42)