Zachytit chybu a uživateli vypsat hlášku

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

Zdravim,

chci se zeptat jakým způsobem řešit zachytávání vyjímek a následně uživateli vypsat ve flash message chybovou hlášku.

Nyní mam model SignManager.php

<?php

namespace AdminModule\Model;

use Nette;

class SignManager implements Nette\Security\IAuthenticator {

    const
        TABLE_NAME = 'users',
        COLUMN_ID = 'id',
        COLUMN_NAME = 'username',
        COLUMN_PASSWORD_HASH = 'password',
        COLUMN_EMAIL = 'email',
        COLUMN_ROLE = 'role';

    private $database;

    public function __construct(\Nette\Database\Context $database) {
        $this->database = $database;
    }

    public function authenticate(array $credentials): Nette\Security\IIdentity {
        list($username,$password) = $credentials;
        $row = $this->database->table(self::TABLE_NAME)->where(self::COLUMN_NAME,$username)->fetch();

        if(!$row) {
            throw new UserNotFoundException('Uživatel nenalezen');
        } elseif(!password_verify($password, $row['password'])) {
            throw new BadPasswordExcetion('Špatné heslo.');
        }

        $array = $row->toArray();
        return new Nette\Security\Identity($row[self::COLUMN_ID],$row['role'],$array);
    }
}

class AuthenticationException extends \Nette\Security\AuthenticationException {}
class UserNotFoundException extends AuthenticationException {}
class BadPasswordExcetion extends AuthenticationException {}

Poté mam zachytávání v SignPresenteru.php, problém je, že při zachycení vidím jen Tracy hlášku, že je např. špatně heslo, jak docílim toho, aby se to zobrazilo na webu a já si to mohl separátně sledovat(pouze po vývojáře).

namespace AdminModule\Presenters;

use Nette,
    Nette\Application\UI\Form,
    Nette\Utils\Html,
	AdminModule\Model\UserNotFoundException,
	AdminModule\Model\BadPasswordException;


class SignPresenter extends BasePresenter {

    private $userManager;

    public function __construct(\AdminModule\Model\UserManager $userManager) {
        $this->userManager = $userManager;
    }

    public function createComponentSignUpForm() {
        $form = new Form;
        $form->addText('username','Přihlašovací jméno: ')
             ->setRequired();
        $form->addEmail('email','E-mail: ')
             ->setRequired();
        $form->addPassword('password','Heslo: ')
             ->addRule(Form::MIN_LENGTH,'Položka musí obsahovat minimálně %d znaků',8)
             ->setRequired();
        $form->addPassword('verifyPassword','Potvrzení hesla: ')
             ->addRule(Form::MIN_LENGTH,'Položka musí obsahovat minimálně %d znaků',8)
             ->addRule(Form::EQUAL,'Hesla se musí shodovat!',$form['password'])
             ->setRequired();
        $form->addSubmit('save','Zaregistrovat se');
        $form->onSuccess[] = [$this,'signUpFormSucceeded'];
        return $form;
    }

    public function signUpFormSucceeded($form,$values) {
        try {
            $this->userManager->register($values->username,$values->email,$values->password);
            $this->flashMessage(
                Html::el()
                ->addHtml('<div class="successful-message">')
                ->addText('Registrace proběhla úspěšně')
                ->addHtml('</div>')
            );
            $this->redirect('Sign:in');
        } catch (UserNotFoundException $e) {
            $this->flashMessage(
                Html::el()
                ->addHtml('<div class="error-message">')
                ->addText('Uživatel nenalezen')
                ->addHtml('</div>')
            );
        } catch (BadPasswordException $e) {
            $this->flashMessage(
                Html::el()
                ->addHtml('<div class="error-message">')
                ->addText('Špatné heslo')
                ->addHtml('</div>')
            );
        }
    }

    public function createComponentSignInForm() {
        $form = new Form;
        $form->addText('username','Přihlašovací jméno: ')
             ->setRequired();
        $form->addPassword('password','Heslo: ')
             ->setRequired();
        $form->addSubmit('save','Přihlásit se');
        $form->onSuccess[] = [$this,'signInFormSucceded'];
        return $form;
    }

    public function signInFormSucceded($form,$values) {
        try {
            $this->getUser()->login($values->username,$values->password);
            $this->redirect(':Admin:Homepage:');
        } catch (UserNotFoundException $e) {
            $this->flashMessage(
                Html::el()
                ->addHtml('<div class="error-message">')
                ->addText('Uživatel nenalezen')
                ->addHtml('</div>')
            );
        } catch (BadPasswordException $e) {
            $this->flashMessage(
                Html::el()
                ->addHtml('<div class="error-message">')
                ->addText('Špatné heslo')
                ->addHtml('</div>')
            );
        }
    }

    public function actionOut() {
        $this->getUser()->logout();
        $this->flashMessage(
                Html::el()
                ->addHtml('<div class="successful-message">')
                ->addText('Odhlášení proběhlo úspěšně.')
                ->addHtml('</div>')
        );
        $this->redirect('Sign:in');
    }
}

Děkuji

Editoval kiCkZ (22. 8. 2017 10:11)

CZechBoY
Člen | 3608
+
0
-

Ty ale odchytáváš výjimky pro registraci, ne pro login.

$this->getUser()->login($values->username,$values->password);

tohle obal do try-catch

kiCkZ
Člen | 153
+
0
-

CZechBoY napsal(a):

Ty ale odchytáváš výjimky pro registraci, ne pro login.

$this->getUser()->login($values->username,$values->password);

tohle obal do try-catch

Opraveno, nicméně stále mi vyběhne hláška od Tracy a ne ta error přímo na webu.

kluzi
Člen | 2
+
+1
-

U výjimek máš špatný namespace. Na začátek SignPresenter.php přidej

use AdminModule\Model\UserNotFoundException;
use AdminModule\Model\BadPasswordException;
kiCkZ
Člen | 153
+
0
-

kluzi napsal(a):

U výjimek máš špatný namespace. Na začátek SignPresenter.php přidej

use AdminModule\Model\UserNotFoundException;
use AdminModule\Model\BadPasswordException;

Opraveno.
Už to funguje :)

Díky

Editoval kiCkZ (22. 8. 2017 10:42)