Diskuze: Žádné ověření duplicitního jména

Tvůrce

Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
Ahoj, patrně máš tu exception v jiném namespace.
Např. pokud UserManager je v namespace App\Model
, pak danou
výjimku máš patrně také tam, tedy
App\Model\DuplicateNameException
.
No a továrnu na formulář máš patrně jinde, např. v
App\Forms
, a pokud v ní zachytáváš
catch (DuplicateNameException)
tak se to bude snažit zachytávat výjimku v daném namespace, tedy
App\Forms\DuplicateNameException
, kterou to pochopitelně
nezachytí, jelikož taková se nevyhazuje.
Osobně výjimky řeším tak, že mám pro ně samotný namespace např.
App\Exceptions
a v souborech, kde výjimky vyhazuji/zachycuji,
mám
use App\Exceptions;
v takovém případě poté všude píšu
throw new Exceptions\DuplicateNameException;
catch (Exceptions\DuplicateNameException)
Nestane se mi tedy, že bych omylem zachytával výjimku ve špatném
namespace a zároveň mám v kódu přehled o tom, o jakou třídu jde, jelikož
v use
nepoužívám celou cestu ke třídě, ale jen k jejímu
namespace. Tedy pak píšu např.
Entities\User
Facades\UserManager
Exceptions\DuplicateNameException
// atd.
Edit: Ještě taková drobnost - unikátní index ve výchozím stavu
neřeší velká a malá písmena, tedy ti půjde registrovat uživatel
"Lukáš" i "lukáš", což možná nechceš (závisí na typu aplikace), tak na
to dej pozor
I když jsem asi špatně pochopil problém Pokud ti to do databáze vloží
řádek se stejným jménem, pak patrně vůbec na tom sloupci s 'username'
nemáš unikátní index.
Super, díky.. Neměl jsem v databázi přidanej ten unikátní index.
A k tomu předchozímu komentu, takže ty si uděláš soubor např. Exceptions
a tam dáš
namespace App\Exceptions
a necháš to prázdný nebo tam i nějak zpracováváš ty výjimky?
V namespace App\Exceptions
mám jednotlivé výjimky, tzn. 1
soubor = 1 výjimka, kdy to nejčastěji vypadá
namespace App\Exceptions;
class DuplicateNameException extends \RuntimeException
{
}
Jen výjimečně potřebuji ve třídě výjimky něco mít, takže naprostá
většina jich jenom dědí a nic víc.
A potom ve třídách, které výjimky používají, to řeším jednoduše
namespace App\Model\Facades;
use Nette;
use App\Exceptions;
class UserManager
{
public function addUser($data)
{
try {
$this->db->insert($data);
} catch (Nette\Database\UniqueConstraintViolationException $e) {
throw new Exceptions\DuplicateNameException();
}
}
}
namespace App\Forms;
use Nette;
use App\Exceptions;
class RegistrationFormFactory
{
public function create()
{
$form = new Form();
// ...
$form->onSuccess[] = array($this, "submitted");
return $form;
}
public function submitted($form, $values)
{
try {
$this->userManager->addUser($values);
} catch (Exceptions\DuplicateNameException $e) {
$form->addError("Jméno již existuje");
}
}
}
Ten kód je jen ukázkový pro představu.
Dobrá, díky moc a ještě jestli mohu jeden dotaz Když mám formulář s
->addTextArea
a pak to chci dále zpracovávat, tak mi to napíše: Object of class
Nette\Forms\Controls\TextArea could not be converted to string. Jak to mohu
tedy převést do stringu?
Do text area někdo vloží text a já ho chci rozkouskovat podle svého pomocí preg_split()
A to nejde jednoduše nějak takhle?
public function create()
{
$form = new Form();
$form->addTexarea("content", "Obsah");
return $form;
}
public function formSubmitted(Form $form, $values)
{
$content = $values->content;
preg_split(..., $content);
}
Jop, to funguje. Díky moc za tvůj čas!
Hezký večer.
Zobrazeno 10 zpráv z 10.