Ako do registračného presenteru dostanem Nette\Security\Password

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

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)

Mysteria
Člen | 797
+
0
-

Buď $hash = \Nette\Security\Passwords::hash($values[‚password‘]); nebo do use přidat Nette\Security\Passwords.

David Matějka
Moderator | 6445
+
+2
-

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)

Čamo
Člen | 798
+
0
-

Obidve som vyskúšal a stále to isté. Však by to hádam malo fungovať tak ako Debugger nie?

Čamo
Člen | 798
+
0
-

Tú triedu tu mám. Ale ladenka tvrdí, že nie.

Editoval Čamo (4. 7. 2014 23:53)

David Matějka
Moderator | 6445
+
0
-

Ta v sandboxu je v namespace App

Čamo
Člen | 798
+
0
-

Nie ja tu mám namespace Nette\Security;

Čamo
Člen | 798
+
0
-

Tak moment mám tu aj triedu App/Model/Password. Prečo je to tu dva krát?

Čamo
Člen | 798
+
0
-

Ok takže use App\Passwords funguje. Ale prečo nefunguje to Nette\Security\Passwords? Chcel by som to konečne pochopiť.

David Matějka
Moderator | 6445
+
0
-

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

Čamo
Člen | 798
+
0
-

No a prečo ten namespace Nette\Security nefunguje? Lebo ja by som to radšej z toho modelu vymazal.

Matey
Člen | 142
+
0
-

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
+
0
-

@Čamo neodpovedel si na moji otazku, mas nette 2.2 a tam tento soubor?

Filip Procházka
Moderator | 4668
+
0
-

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
+
0
-

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
+
0
-

Třída Passwords je statická, nemusíš z ní dělat instanci, i funkci verify můžeš volat staticky.

Čamo
Člen | 798
+
0
-

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
+
0
-

Jak mas nainstalovany nette? Doufam, ze pres composer :)

Čamo
Člen | 798
+
0
-

Neviem, či práve tento projekt som inštaloval cez composer, ale tuším, že áno. Mám tu nejaký composer.json. Ale ako to spolu súvisí? Ako je možné, že tú triedu nevidí?

David Matějka
Moderator | 6445
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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

Čamo
Člen | 798
+
0
-

Ok tak idem na to.

David Grudl
Nette Core | 8234
+
0
-

V Nette 2.1.x třída Nette\Security\Password, jak už tu bylo párkrát zmíněno, není.

Čamo
Člen | 798
+
0
-

Tak som to spustil(composer update to bol). No a všetko prebehlo asi tak ako malo. Akurát, že teraz v zložke nette/Security žiadny súbor password.php nieje a Tracy píše stále to svoje „not found“.

David Matějka
Moderator | 6445
+
0
-

@Č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
+
0
-

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ť?

Čamo
Člen | 798
+
0
-

matej21:
Zmeniť to mám na 2.2 v composer.json či kde?

David Matějka
Moderator | 6445
+
0
-

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)

Čamo
Člen | 798
+
0
-

Díky mateji máš to u mňa. Moje nervy ťa srdečne pozdravujú.