Class not found ikdyž existuje
- fritol
- Člen | 9
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)
- Honza Marek
- Člen | 1664
Prosím příště čitelněji
Tipnul bych, že bude chyba v nesmazaných tempech nebo nějakém překlepu (Extend/Extended?)
- Mikulas Dite
- Člen | 756
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
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
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
Č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
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
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
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
$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
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.
- Mikulas Dite
- Člen | 756
Ještě mě napadá, zapni si v bootstrapu strict mode,
Debug::$strictMode = true
. Mohl by povědět něco
zajímavého.
- Mikulas Dite
- Člen | 756
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).