Ako overiť existujúci Email v Databázy v Nette 2.4

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

Zdravím …
Práve som stiahol najnovšie Nette 2.4 a pozerám že už aj registrácia sa rieši v try{}catch{} ktoré bolo iba v login presenteru moja otázka znie ako teraz vložiť overenie existujúceho emailu v databáze do kódu aby mi to overilo existenciu?

Za odpoveďe/nasmeroavnia a pomoc vopred Ďakujem.

CZechBoY
Člen | 3608
+
0
-

Nejspíš řešíš autentizaci.
https://github.com/…mFactory.php
https://github.com/…rManager.php

Prostě v autentizátoru vyhodíš výjimku a tu ve formuláři/komponentě/někde zachytíš a nějak zpracuješ.

btw. to že je to takhle v sandboxu tak to neznamená že to tak musíš použít, ale metoda výjimek je asi jediná použitelná, protože výsledek volání funkce IAuthenticator::authenticate se očekává instance IIdentity. Případně ještě můžeš do metody User::login předat hotovou IIdentity, viz https://github.com/…uthenticator

iguana007
Člen | 970
+
0
-

Já si spíše myslím, že @SontoEremo řeší validaci během registrace, proto viz. třeba tady: https://forum.nette.org/…ho-uzivatele

CZechBoY
Člen | 3608
+
+1
-

Tak v tom případě si udělám na políčku validaci s callbackem

public function create()
	$form = $this->formFactory->create();

	$form->addText('email')
		->setRequired()
		->addRule([$this, 'validateUniqueEmail'], 'Email již někdo používá');

	return $form;
}

/** @return bool */
public function validateUniqueEmail(TextInput $emailControl)
{
	$value = $emailControl->getValue();

	return !$this->userManager->emailExists($value);
}
SontoEremo
Člen | 341
+
0
-

CZechBoY napsal(a):

Zdravím ťa a díky za kód :)
Používal som tento

->addRule(function($input) use($userManager)
             {
                return !$userManager->isEmailExist($input->value);
             }, 'Táto Emailová adresa je už zaregistrovaná!')

Ale ten tvôj je lepší…
V tom

return !$this->userManager->isEmailExist($value);

mám mať

public function isEmailExist($email = NULL) {
		return $this->database->table(self::TABLE_NAME)->where(self::COLUMN_EMAIL, $email)->fetch();
	}

Je to tak správne? lebo je to funkčné

CZechBoY
Člen | 3608
+
0
-

@SontoEremo jj neco takovyho.
V cem sis teda nevedel rady?

SontoEremo
Člen | 341
+
0
-

CZechBoY napsal(a):

@SontoEremo jj neco takovyho.
V cem sis teda nevedel rady?

->addRule(function($input) use($userManager)
             {
                return !$userManager->isEmailExist($input->value);
             }, 'Táto Emailová adresa je už zaregistrovaná!')

Nevedel som že tento kód je bezpečný a použiteľný nakoľko je to vyše 2 ročná záležitosť a Nette napreduje.
Takže či aj moje riešenie je alebo bolo bezpečné .

Jan Mikeš
Člen | 771
+
+2
-

Je lepší to ověřovat i při samotném zápisu do databáze (unique na sloupci v db a obalit insert do try{} catch {}), představ si, že ve stejnou chvíli by 2 ruzní uživatelé odeslali stejně vyplněný formulář s registrací a aplikace běžela oběma stejně rychle, validace jim projde, protože v době validace v databázi ještě není, ale při insertu by byl jeden o trochu rychlejší, tomu druhému by se objevil server error a appka spadla na PDO exception (je to trochu sci-fi situace, ale pokud ošetříš i samotný insert, pak už by to mělo být neprůstřelné).