Class not found ikdyž existuje

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

Ahoj, mám takový problém.
laděnka píše, že třída neexistuje, ikdyž třída existuje.

<?php
Fatal Error
Class 'ExtendAuthenticator' not found

Source file ▼
File: C:\Users\Petr\workspace\Pokus\pokus\src\web\app\AdminModule\presenters\LoginPresenter.php   Line: 56

Line 49:
Line 50:        public function loginFormSubmitted($form)
Line 51:        {
Line 52:            try {
Line 53:                $values = $form->values;
Line 54:                $values['baseRole'] = 'SUPERADMIN';
Line 55:                //nastaveni autentizacniho handleru
Line 56:                $this->getUser()->setAuthenticationHandler(new ExtendAuthenticator());
Line 57:                //$this->getUser()->setAuthorizationHandler(new Acl());
Line 58:
Line 59:                if ($values['remember']) {
Line 60:                    $this->getUser()->setExpiration('+ 14 days', FALSE);
Line 61:                } else {
Line 62:                    $this->getUser()->setExpiration('+ 20 minutes', TRUE);
Line 63:                }
?>

Nefunguje, ani když před to vložím require_once. V kódu chyba není, stejný kód funguje i na našem produkčním serveru i druhýmu programátorovi. Zkoušel jsem různé verze PHP 5.3.0 5.2.11, prohledávali jsme fórum, mysleli jsme že je chyba v robotovi, tak jsme upgradovali nette, ale stále nic. Už jsme z toho zoufalí, nenapadá nás nic. Temp smazané, vyzkoušej jiný název třídy, přesunuli jsme tu třídu třeba přímo do base, nebo libs\nette\aplication, stále nic nezabírá.

Poradí někdo prosím?

edit: class

<?php
class ExtendAuthenticator extends Object implements IAuthenticator{

	//---------------------- Promenne tridy -------------------------

	//---------------------- Konstruktor tridy ------------------------
	public function __construct() {
	}

	//---------------------- Funkce tridy -----------------------------

	    public function authenticate(array $credentials)
    {
        $username = $credentials[self::USERNAME];
		$password = sha1($credentials[self::PASSWORD].SALT);
        // přečteme záznam o uživateli z databáze
		$userModelService = new LoggedUserModelService();
		$row = $userModelService->findByLogin($username);

		$this->kontrolaUzivatele($row,$password, $username);
        //$extendIdentity = new ExtendIdentity();
        //TODO autorizace
        $extendIdentity = $userModelService->data2ExtendIdentity($row);
        $userModelService->updateUserStatistics($username); //update casu prihlaseni

        return $extendIdentity; // vrátĂme identitu
    }


    private function kontrolaUzivatele($row, $password, $username){
        if (!$row) { // uĹľivatel nenalezen?
            throw new AuthenticationException("User '$username' not found.", self::IDENTITY_NOT_FOUND);
        }

        if ($row->heslo != $password) { // hesla se neshodujĂ?
            throw new AuthenticationException("Invalid password.", self::INVALID_CREDENTIAL);
        }

        if ($row->aktivni != '1') { // neni aktivni
            throw new AuthenticationException("User is not active.", self::INVALID_CREDENTIAL);
        }

        if ($row->blokovany == '1') { // je blokovany
            throw new AuthenticationException("User is blocked.", self::INVALID_CREDENTIAL);
        }
        if (!empty($row->datplatnostod) && strtotime($row->datplatnostod)>strtotime(date('Y-m-d'))) { // je blokovany
            throw new AuthenticationException("User is can not login now.", self::INVALID_CREDENTIAL);
        }

        if (!empty($row->datplatnostdo) && strtotime($row->datplatnostdo)<strtotime(date('Y-m-d'))) { // je blokovany
            throw new AuthenticationException("User login expired.", self::INVALID_CREDENTIAL);
        }
    }


}
?>

Editoval fritol (28. 3. 2010 18:01)

sodae
Nette Evangelist | 250
+
0
-

smazal jsi obsah složky temp? a furt to dělá?

Honza Marek
Člen | 1664
+
0
-

Prosím příště čitelněji

Tipnul bych, že bude chyba v nesmazaných tempech nebo nějakém překlepu (Extend/Extended?)

fritol
Člen | 9
+
0
-

temp mažu – viz prvni prispevek, chyba v kódu jak píšu není, druhýmu programátorovi to funguje, i jsem zkoušel měnit nazev třídy na abc ale stále to nefunguje. Když před to dám require_once s tím souborem kde je ta třída tak to projde, ale třídu stejně nenajde.

22
Člen | 1478
+
0
-

Kdyby jsi ten první příspěvek přeformátoval, jak ti radí Honza, tak by ti třeba někdo řek, kde je problém, ovšem takle to asi nikdo zkoumat nebude.

fritol
Člen | 9
+
0
-

omlouvám se, přeformátováno

Mikulas Dite
Člen | 756
+
0
-

Očividně to otevíráš (a po prohlédnutí ukládáš) ve špatném formátování, sice by to nemělo zlobit takhle, ale stejně to zkus otevřít jinak a uložit (utf-8). Případně zkus přímo to co ti někdo jiný poslal, bez toho přepisování. Úplně stejný kód by ti měl fungovat – ale ověř, jestli tam kam robotLoader pro tu třídu šahá může.

fritol
Člen | 9
+
0
-

Ano měl sem to ve špatném formátování cp1250, aspoň eclipse to takhle formatoval, idkyž jsem to ale přepl na celém projektu do UTF8 stejně to chybu nevyřešilo, přebiral jsem verzi z SVNka přes eclipse, ale stejne pokud mi poslal celý projekt v zipu, ja si to rozbalil a aniž bych to nějak modifikoval, tak stále stejná chyba, přitom mu to jede bez problémů. Může se jednat o nějaké špatné nastavení? Např. PHP? Používám wamp server…

Editoval fritol (28. 3. 2010 18:31)

fritol
Člen | 9
+
0
-

Vytvořil jsem novou třídu abc

<?php
class abc {


}
?>

a v login prezenteru:

<?php
public function loginFormSubmitted($form)
	{
		try {
			$new = new abc();
			$values = $form->values;
			$values['baseRole'] = 'SUPERADMIN';
			//nastaveni autentizacniho handleru
			$this->getUser()->setAuthenticationHandler(new ExtendAuthenticator());
			//$this->getUser()->setAuthorizationHandler(new Acl());

			if ($values['remember']) {
				$this->getUser()->setExpiration('+ 14 days', FALSE);
			} else {
				$this->getUser()->setExpiration('+ 20 minutes', TRUE);
			}
			$this->getUser()->authenticate($values['username'], $values['password'], $values['baseRole']);
			//role a prava
        	$acl = new Acl(); //sprava prav a roli - nacitani je v konstruktoru
        	$this->redirect('Default:');

		} catch (AuthenticationException $e) {
			$form->addError($e->getMessage());
		}
	}
?>

ale zase hlásí že neexistuje, netuší někdo?

Editoval fritol (28. 3. 2010 19:28)

Mikulas Dite
Člen | 756
+
0
-

Čistě pro úplnost zkus pustit Requirements checker, je v distribuci. Jestli ti projde (jako že asi jo), tak zkus ty soubory naincludovat ručně. To pak asi bude fungovat. Takže problém bude v robotLoaderu – mrkni do config.ini, odkud teď tahá.

fritol
Člen | 9
+
0
-

Tak jsme zjistili, že nefungují všechny věci z base.
např: $form = new BaseForm();
$model = new BaseModel();
$serv = new LoggedUserModelService();

Přikladam config.ini

<?php
[common]
; PHP configuration
php.date.timezone = "Europe/Prague"
php.iconv.internal_encoding = "%encoding%"
php.mbstring.internal_encoding = "%encoding%"

; services
service.Nette-Security-IAuthenticator = UsersModel

service.Nette-Loaders-RobotLoader.option.directory[] = %baseDir%
service.Nette-Loaders-RobotLoader.option.directory[] = %appDir%
service.Nette-Loaders-RobotLoader.option.directory[] = %libsDir%
service.Nette-Loaders-RobotLoader.run = TRUE

?>

bootstrap

<?php

/**
 * My Application bootstrap file.
 *
 * @copyright  Copyright (c) 2010 John Doe
 * @package    MyApplication
 */



// Step 1: Load Nette Framework
// this allows load Nette Framework classes automatically so that
// you don't have to litter your code with 'require' statements
require LIBS_DIR . '/Nette/loader.php';



// Step 2: Configure environment
// 2a) enable Nette\Debug for better exception and error visualisation
Debug::enable();

// 2b) load configuration from config.ini file
Environment::setVariable('baseDir', WWW_DIR . '/../base');
Environment::loadConfig();

dibi::connect(Environment::getConfig('database'));
//salt
define('SALT', Environment::getConfig('salt'));

//informce o strankach z konfigu
//TODO asi by bylo lepe, kdyby se ty info nacitaly z DB
$pageInfo = Environment::getConfig('pageinfo');
define('PAGEINFO_MAIL', $pageInfo['mail']);
define('PAGEINFO_WEBADMIN', $pageInfo['webadmin']);
define('DEFAULT_LANG', $pageInfo['lang']);
define('APPNAME', $pageInfo['appName']);
//loacale
setLocale(LC_ALL, "Czech");
//absolutni cesta k nasim knihovnam - nacteni nasich knihoven
//LATER vyresit lepe nacitani pres config.ini
define('MODULES_DIR', WWW_DIR . '/../base');
$loader = new RobotLoader();
$loader->addDirectory(MODULES_DIR);
$loader->addDirectory(LIBS_DIR);
$loader->addDirectory(APP_DIR);

/*$loader->autoRebuild = TRUE;*/
$loader->register();



// Step 3: Configure application
// 3a) get and setup a front controller
$application = Environment::getApplication();
$application->errorPresenter = 'Common:Error';
$application->catchExceptions = FALSE; //toto bude platne  kvuli ladeni na produkcnim serveru
//$application->catchExceptions = TRUE;


// Step 4: Setup application router
$router = $application->getRouter();

//definice multijazycnych rout:
Route::addStyle('#en-presenter', 'presenter');
Route::addStyle('#cs-presenter', 'presenter');

Route::setStyleProperty('#en-presenter', Route::FILTER_TABLE, array(
        'supervisor-users' => 'SupervisorUsers',
        'supervisor-user' => 'SupervisorUser',
		'language-code-list' => 'JazykCodeList',
		'login' => 'Login',
		'to-do' => 'ToDoList'
));
Route::setStyleProperty('#cs-presenter', Route::FILTER_TABLE, array(
        'supervisor-uzivatele' => 'SupervisorUsers',
        'supervisor-uzivatel' => 'SupervisorUser',
		'jazyk-ciselnik' => 'JazykCodeList',
		'prihlaseni' => 'Login',
		'seznam-ukolu' => 'ToDoList'
));

$router[] = new Route('index.php', array(
	'module' => 'Frontend',
	'presenter' => 'Homepage',
	'action' => 'default',
), Route::ONE_WAY);

/* vicejazycne routy, ktere smeruji na stejnnou vec, ale tremi zpusoby
 * v idelanim pripade zrusit posledni routu - zpomaluuje apliakci!!!*/
$router[] = new Route('en/supervisor-admin/<presenter #en-presenter>/<action>/<id>', array(
	'lang' => 'en',
	'module' => 'SupervisorAdmin',
	'presenter' => 'Default',
	'action' => 'default',
	'id' => NULL,
));

$router[] = new Route('cs/supervisor-admin/<presenter #cs-presenter>/<action>/<id>', array(
	'lang' => 'cs',
	'abc' => 'AAAA',
	'module' => 'SupervisorAdmin',
	'presenter' => 'Default',
	'action' => 'default',
	'id' => NULL,
));
$router[] = new Route('supervisor-admin/<presenter>/<action>/<id>', array(
	'lang' => DEFAULT_LANG,
	'module' => 'SupervisorAdmin',
	'presenter' => 'Default',
	'action' => 'default',
	'id' => NULL,
));

/*School admin*/
$router[] = new Route('en/school-admin/<presenter #en-presenter>/<action>/<id>', array(
	'lang' => 'en',
	'module' => 'SchoolAdmin',
	'presenter' => 'Default',
	'action' => 'default',
	'id' => NULL,
));

$router[] = new Route('cs/school-admin/<presenter #cs-presenter>/<action>/<id>', array(
	'lang' => 'cs',
	'module' => 'SchoolAdmin',
	'presenter' => 'Default',
	'action' => 'default',
	'id' => NULL,
));
$router[] = new Route('school-admin/<presenter>/<action>/<id>', array(
	'lang' => DEFAULT_LANG,
	'module' => 'SchoolAdmin',
	'presenter' => 'Default',
	'action' => 'default',
	'id' => NULL,
));

$router[] = new Route('<presenter>/<action>/<id>', array(
	'lang' => DEFAULT_LANG,
	'module' => 'Frontend',
	'presenter' => 'Homepage',
	'action' => 'default',
	'id' => NULL,
));


// Step 5: Run the application!
$application->run();
?>

Editoval fritol (28. 3. 2010 19:54)

Mikulas Dite
Člen | 756
+
0
-

Pošli spíš adresářovou strukturu, zdá se mi to nějaký divoký, viz třeba Environment::setVariable('baseDir', WWW_DIR . '/../base');.

fritol
Člen | 9
+
0
-

Cesty jsou správně. V logu když si rozkliknu cestu k base a vlozim do totalcommanderu s cd tak mi to do base najede. Zajímavé že když v base udelam jakykoliv php skript, dam dovnitr treba echo „xxx“; a dam require toho souboru odkudkoli tak ho sice pripoji ale echo nezobrazi, dokonce kdyz ten php skript nejak znevalidnim, on ho stejne pripoji, ale echo nezobrazi – ani nezahlasi chybu, jako by ten soubor nasel, ale nemohl ho precist. Možná je problém v právech, ale nevím jak to zjistit nebo co s tím. Mám win7 ale zkusil sem to i na notasu s win XP, končí na stejnou chybu.

Majkl578
Moderator | 1364
+
0
-
$loader = new RobotLoader();
$loader->addDirectory(MODULES_DIR);
$loader->addDirectory(LIBS_DIR);
$loader->addDirectory(APP_DIR);

/*$loader->autoRebuild = TRUE;*/
$loader->register();

Tohle smaž, už to máš v configu.

Je cache robotloaderu v dočasném adresáři? Má požadovaný obsah?

Mikulas Dite
Člen | 756
+
0
-

Začínám spíš mít pocit, že je to nějaké omezení serveru. Teoreticky by měl hlásit něco jako

Warning: require() [function.require]: open_basedir restriction in effect. File(../base/) is not within the allowed path(s): ...

Mrkni, jestli máš display_errors na on, atd.

fritol
Člen | 9
+
0
-

J teď sem se díval, PHP má nastavené display_errors = on

Nějaké další nápady prosím?

Nebo mám vyzkoušet odinstalovat wampserver a nainstalit apache, php, a mysql ručně?

lactarius
Člen | 47
+
0
-

Base většinou bývají abstraktní třídy – proto z nich nemůžeš vytvořit instanci.

Mikulas Dite
Člen | 756
+
0
-

Ještě mě napadá, zapni si v bootstrapu strict mode, Debug::$strictMode = true. Mohl by povědět něco zajímavého.

iguana007
Člen | 970
+
0
-

Možná je to úplná blbost, ale zkusit to můžeš: zkus přejmenovat tu složku „base“ na „app“ či cokoli jiného a přenastavit i v bootstrapu. Možná bude nějaká spojitost v tom, proč ti to nefunguje právě s těmi Base třídama.

Mikulas Dite
Člen | 756
+
0
-

Jak tak na to koukám, v bootstrapu máš robotLoader nalinkovanej dobře, ale jak ti radil Majkl ti tam zbyl pouze ten v configu. Velmi pravděpodobně se může poustit jenom jednou, a protože ten v configu je dřív, ostatní se ti už nenačte. Smaž řádky s robotLoaderem v configu, nebo je oprav (a smaž je v bootstrapu).

fritol
Člen | 9
+
0
-

Vyřešeno, jsme chujové, ale nepomohla žádná z rad :)

Problém vyřešen nastavením php.ini short_open_tag on

v těch třídách v base jsme měli jen <? a u všech ostatních <?php

každopádně díky všem za rady.

Majkl578
Moderator | 1364
+
0
-

To mě napadlo, ale přišlo mi to jako taková banalita, že jsem to ani nepsal…