Ako do registračného presenteru dostanem Nette\Security\Password
- Čamo
- Člen | 798
Zdravím vás,
miestny štamgasti ma presvedčili, aby som pri prihlasovaní použil triedu
Nette\Securit\Password.
Ale nech robím čo chcem, neviem ju dostať do presentera: Class
‚Nette\Security\Passwords‘ not found
Zatiaľ som skončil pri tomto:
<?php
namespace App\Presenters;
use Nette,
Nette\Security,
Nette\Diagnostics\Debugger;
/**
* Registration presenter.
*/
class RegistPresenter extends \App\Presenters\BasePresenter
{
/** @var Nette\Database\Context */
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
/**
* Registration form factory.
* @return Nette\Application\UI\Form
*/
protected function createComponentRegistForm()
{
$form = new Nette\Application\UI\Form;
$form->addText('username', 'User name:')
->setRequired('Please enter your username.')
->setAttribute('class', 'formEl');
$form->addPassword('password', 'Password:')
->setRequired('Please enter your password.')
->addRule($form::MIN_LENGTH, 'Zadajte prosím heslo s minimálne %d znakmi', 3)
->setAttribute('class', 'formEl');
$form->addPassword('password2', 'Password check:')
->setRequired('Please enter your password.')
->addRule($form::EQUAL, 'Heslá sa nezhodujú. Skontrolujte ich prosím.', $form['password'])
->setAttribute('class', 'formEl');
$form->addSubmit('send', 'Registrovať');
// call method RegistFormSucceeded() on success
$form->onSuccess[] = $this->registFormSucceeded;
return $form;
}
public function registFormSucceeded($form)
{
$values = $form->getValues();
$hash = Passwords::hash($values['password']);
Debugger::dump($hash);
}
}
Skúšal som všetko možné: new Nette\Security\Passwords a pod. ale zjavne
niečo nechápem.
Vie mi niekto prosím vás povedať, čo nechápem?
Editoval Čamo (4. 7. 2014 23:20)
- David Matějka
- Moderator | 6445
Nette\Security\Passwords je v nette az od 2.2, tak bud aktualizuj, nebo si tu tridu zkopiruj do sveho projektu (byla treba i v sandboxu pro 2.1)
- David Matějka
- Moderator | 6445
Nie ja tu mám namespace Nette\Security;
takze mas verzi 2.2, kde je v balicku Security v souboru Passwords.php
namespace Nette\Security
a trida Passwords?
Tak moment mám tu aj triedu App/Model/Password. Prečo je to tu dva krát?
ta v app byla v sandboxu pro verzi 2.1, ve 2.2 se presunula primo do frameworku
- Matey
- Člen | 142
ak trieda Nette\Security\Passwords existuje … a kód ktorý si sem dal sa ešte nezmenil tak máš zle use, máš tam:
<?php
use Nette\Security
Passwords:: // mal by si predsa použiť Security\Passwords:: lebo use "siaha" po Security, nie po Passwords
// alebo prepísať use na Nette\Security\Passwords a používať Passwords::
?>
- David Matějka
- Moderator | 6445
@Čamo neodpovedel si na moji otazku, mas nette 2.2 a tam tento soubor?
- Filip Procházka
- Moderator | 4668
Předtím než se zeptáš na něco dalšího si velmi pozorně přečti tuto stránku http://cz1.php.net/namespaces
- Čamo
- Člen | 798
Ja už som z toho na prášky. Dnes to zrazu všetko funguje. Prečítal som
aj tú dokumentáciu…
Zrazu funguje aj
use Nette\Security\Password
$hash = Password::hash($var);
aj
$pass = new Nette\Security\Password;
$pass->hash($var);
Pritom by som prisahal, že som včera všetky tieto možnosti vyskúšal a nefungovali. Už budete na prášky aj vy zo mňa. Sa ospravedlňujem.
- Filip Procházka
- Moderator | 4668
Třída Passwords
je statická, nemusíš z ní dělat
instanci, i funkci verify
můžeš volat staticky.
- Čamo
- Člen | 798
Ja viem, že to bude znieť divne, ale dnes mi to zase prestalo fungovať a
hlási tú istú chybu: Nette\Security\Passwords not found.
Už fakt nechápem čo sa deje. Všetko ostalo ako pred tým, len som doplnil
nejaký kód. Mám tam to čo pred tým:
use Nette\Security\Passwords;
$hash = Passwords::hash($values['password']);
Povedzte mi čo je na tomto zle? A ten súbor samozrejme existuje:
<?php
/**
* This file is part of the Nette Framework (https://nette.org)
* Copyright (c) 2004 David Grudl (http://davidgrudl.com)
*/
namespace Nette\Security;
use Nette;
/**
* Passwords tools. Requires PHP >= 5.3.7.
*
* @author David Grudl
*/
class Passwords
{
const PASSWORD_MAX_LENGTH = 4096;
const BCRYPT_COST = 10;
...
Čo som bol dnes dlho na slnku?
EDIT:
A tak ako včera, funguje to, keď to prepíšem na
use App\Passwords;
$hash = Passwords::hash($var);
Editoval Čamo (7. 7. 2014 22:18)
- David Matějka
- Moderator | 6445
No vypada to, ze je neco spatne s autoloaderem. Ale pokud je to jak rikas composerem, tak zkus spustit „composer dump-autoload“, pripadne uplne smazat nette a znovu ho nainstalovat.. btw, v jake slozce a souboru mas tu tridu Nette\Security\Passwords?
Editoval matej21 (7. 7. 2014 22:36)
- Čamo
- Člen | 798
Ešte doplním, že Nette je 2.1.2 a tá zložka je
vendor/nette/security/src/Security/Passwords.php
No a keď to budem znova inštalovať, tak stačí vybrať adresár app a potom
ho znovu nakopírovať? To bude v poriadku? Ešte idem skúsiť ten zázračný
príkaz od ktorého ani neviem čo mám čakať.
- David Matějka
- Moderator | 6445
Asi mas na mysli 2.2.2. Ten composer dump-autoload pregeneruje autoloading composeru.
A pro preinstalovani nette smaz vendor/nette a pak spust „composer install“
- Čamo
- Člen | 798
Nie tá verzia je 2.1.2 našiel som to v ladenke, keďže readme.txt nič
nepíše.
No a ten composer mi píše takúto vec: Warning: This development build of
composer is over 30 days old. It is recomendet to update it by running
„C:\Documents and Settings\All Users\Aplication
Data\ComposerSetup\bin\composer.phar self-update“. To písal už pred tým,
ale som na to kašlal.
No a teraz pomaly, lebo príkazový riadok je moja najsilnejšia stránka.
Takže mám v danom projekte zmazať zložku vendor a potom čo??? Akosi to
nechápem. Však composer mi tam prdne celý nový sandbox aa prepíše mi
všetko, nie?
- David Matějka
- Moderator | 6445
nemusis mazat celou vendor slozku, pouze vendor/nette (nevim, jestli nepouzivas onu vendor/others, nebo jak se ten Daviduv vymysl jmenuje, tak at si to nesmazes)
pak v rootu projektu akorat spustis composer install (pripadne composer update) a pak composer nainstaluje nette spravne
- David Grudl
- Nette Core | 8234
V Nette 2.1.x třída Nette\Security\Password, jak už tu bylo párkrát zmíněno, není.
- David Matějka
- Moderator | 6445
@Čamo asi mas v composeru verzi 2.1, tak si to zmen na 2.2 a spust composer update. Nevim, cos tam pred tim vytvarel, ze ten soubor existoval..
- Čamo
- Člen | 798
DG:
A keby som zobral tú triedu čo je v app/model/Passwords.php prepísal jej
namespace a skopíroval ju do nette/Security tak by to nefungovalo? Lebo mi tá
trieda v modeli proste nesedí. Iba o to ide. Alebo mám vytvoriť nový
projekt v nette 2.2 a prepísať app? Alebo čo mám robiť?
- David Matějka
- Moderator | 6445
Nikdy v projektu nevytvarej tridy, ktere jsou v namespace Nette. Pokud mas verzi nette 2.1 a chces na ni zustat, tak pouzij onu App\Passwords (nebo jak se jmenuje) ze sandboxu. Pokud chces pouzivat Nette\Security\Passwords, aktualizuj na 2.2
Zmeniť to mám na 2.2 v composer.json či kde?
Ano, je tam neco jako "nette/nette": "~2.1.0"
, tak to vymen za
"nette/nette": "~2.2.0"
Editoval matej21 (7. 7. 2014 23:36)