Autentizace – nepřipojení k db
- EL
- Člen | 17
Zdravim, nebudu to nijak protahovat…takže problém je
následující…
mám přihlašovací formulář, ale vyhnije mi při
$user->authenticate($form['email']->getValue(), $form['pass']->getValue());
metoda pro autentizaci potom vypadá následovně
public function authenticate(array $credentials)
{
$username = strtolower($credentials['email']);
$password = strtolower($credentials['pass']);
$row = dibi::select('*')->from('stravnik')->where('email=%s', $username)->fetch();
if (!$row) {
throw new AuthenticationException("E-mail '$username' nenalezen.", self::IDENTITY_NOT_FOUND);
}
if ($row->password !== $password) {
throw new AuthenticationException("Nesprávné heslo.", self::INVALID_CREDENTIAL);
}
unset($row->password);
return new Identity($row->username, NULL, $row);
}
a konkrétně mi chybu cyhodí řádek s komunikací s db
"Dibi is not connected to database."
ale přitom presenter pro login formulář extenduje BasePresenter, kterému se v protected metodě při startupu vytváří nová instance Modelu, který v konstruktoru vytváří připojení k databázi.
Co bych tedy měl kam připsat, aby se mi dibi připojilo k databázi?
Předem díky
edit: samozřejmě pokud potřebujete další info, stačí říct
Editoval EL (21. 11. 2009 11:02)
- EL
- Člen | 17
honzakuchar napsal(a):
Já volám dibi::connect už v bootstrapu s možností lazy.
Moh bys to prosím zapsat nějak konkrétnějc, co mám přesně do bootstrapu napsat? (s nette a dibi úplně začínám)
a jinak ale mělo by se to připojit i tak, když v base presenteru to jede, ne? A ostatně i na jinejch presenterech se k db taky dostanu, ale tady prostě ne
- EL
- Člen | 17
_Martin_ napsal(a):
EL napsal(a):
edit: samozřejmě pokud potřebujete další info, stačí říct
Jak vypadá kód pro připojení? Ukaž kousek toho presenteru.
Edit: nejlíp tu část, kde se připojuješ + tu část, kde vytváříš ten model pro autentifikaci.
abstract class BasePresenter extends /*Nette\Application\*/Presenter
{
/** @var Model */
protected $model;
protected function startup()
{
parent::startup();
$this->model = new Model;
}
}
class Model extends /*Nette\*/Object
{
/** @var DibiConnection */
private $db;
public function __construct()
{
$this->db = new DibiConnection(array(
'driver' => 'mysql',
'host' => 'localhost',
'username' => '...',
'password' => '...',
'database' => '...'
));
$this->db->query("SET NAMES utf8");
}
class LoginFormPresenter extends BasePresenter
{
public function loginFormSubmitHandler($form)
{
try {
$user = Environment::getUser();
Debug::dump($form->getValues());
$user->setAuthenticationHandler(new StravnikAuth);
$user->authenticate($form['email']->getValue(), $form['pass']->getValue());
$this->getApplication()->restoreRequest($this->backlink);
$this->redirect('Table:');
} catch (AuthenticationException $e) {
$form->addError($e->getMessage());
}
}
pro class StravnikAuth extends Object implements IAuthenticator je ta metoda v prvním postu
- redhead
- Člen | 1313
EL napsal(a):
Moh bys to prosím zapsat nějak konkrétnějc, co mám přesně do bootstrapu napsat?
Já používám v bootstrepu něco jako tohle:
dibi::connect(array(
'driver' => 'mysql',
'host' => 'localhost',
'user' => 'root',
'password' => '',
'database' => 'db',
'lazy' => TRUE
)
);
Nebo lze ještě využít config, kde je uvedeno to samé výše..
dibi::connect($config['database']));
To zaručuje, že se připojí vždy a odkudkoliv, a navíc lazy.
Editoval redhead (21. 11. 2009 11:27)
- _Martin_
- Generous Backer | 679
EL napsal(a):
$this->db = new DibiConnection(array(
Tady je zakopanej pudl. Sice vytvoříš nové připojení, ale potom
nepřistupuješ k jeho instanci. Volání dibi::query
se snaží
použít vlastní připojení, které ovšem neexistuje (o nějaké
$this->db
jakési jiné třídy dibi vědět nemůže).
Řešení jsou dvě:
- změnit tenhle řádek za
$this->db = dibi::connect(array(
- nepoužívat ten model na připojení, ale připojovat se v bootstrapu, jak radí jiní.