Autentizace – nepřipojení k db

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

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)

Honza Kuchař
Člen | 1662
+
0
-

Já volám dibi::connect už v bootstrapu s možností lazy.

EL
Člen | 17
+
0
-

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

_Martin_
Generous Backer | 679
+
0
-

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.

Editoval _Martin_ (21. 11. 2009 11:19)

EL
Člen | 17
+
0
-

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

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

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ě:

  1. změnit tenhle řádek za $this->db = dibi::connect(array(
  2. nepoužívat ten model na připojení, ale připojovat se v bootstrapu, jak radí jiní.
EL
Člen | 17
+
0
-

už to funguje, díky všem ;)

edit: a teda teĎ už pokud budu potřebovat kdekoliv pracovat s db, tak místo $this->db→ budu pouzivat dibi:: předpokládám

Editoval EL (21. 11. 2009 11:51)

_Martin_
Generous Backer | 679
+
0
-

EL napsal(a):

edit: a teda teĎ už pokud budu potřebovat kdekoliv pracovat s db, tak místo $this->db→ budu pouzivat dibi:: předpokládám

Jj. A nebo… můžeš každý model udělat jako potomka Modelu – a potom můžeš v modelech používat $this->db.