Ako overiť existujúci Email v Databázy v Nette 2.4
- SontoEremo
- Člen | 341
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
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
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
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
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é
- SontoEremo
- Člen | 341
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
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é).