ako pracovať s modelom, prepojenia s presenterom atd

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

Jo díky už to funguje.
Návod u prizpevku 36 je ok. motal jsem nekolik veci dohromady a delal jsem to sloziteji než bylo potřeba.

Hlavně mě nenapadlo že cod v komentarich něco provádí :)
Stale jsem si myslel že mám spatne ns.

Mysteria
Člen | 797
+
0
-

@KEnik: V klidu, když jsem s Nette začínal, tak jsem to měl stejný. Ono totiž je rozdíl mezi /* */ a /** */, to první je skutečně jenom komentář, to druhé už může mít vliv na kód.

Matey
Člen | 142
+
0
-

zdravím, chcel som si spraviť zmenu hesla pre uživatela, službu UserManager som si injectol cez anotacie do ProfilePresenter ale nejak sa tam nikdy nedostal, cez __construct mi to ide, v čom môže byť problém že to nechce ísť cez inject? ďakujem

<?php
services:
	- App\UserManager
?>
<?php
namespace App;

use Nette,
	Nette\Utils\Strings;

class UserManager extends Nette\Object implements Nette\Security\IAuthenticator
{
	public function changePassword($username, $password)
	{
		$this->database->table(self::TABLE_NAME)->where(self::COLUMN_NAME, $username)->update(array(
			self::COLUMN_PASSWORD_HASH => Passwords::hash(self::removeCapsLock($password)),
		));
	}
}
?>
<?php
namespace App\AdminModule;

use Nette,
	App,
	App\Model;

class ProfilePresenter extends BasePresenter
{
	// nefunguje
	/**
	 * @var \App\UserManager
	 * @inject
	 */
	private $userManager;

	// funguje
	private $userManager;
	public function __construct(App\UserManager $userManager)
	{
		$this->userManager = $userManager;
	}

	public function processChangePasswordForm(Nette\Application\UI\Form $form)
	{
		// ak použijem @inject userManager tak to nejde, s __construct ide, čo robím zle? veď predsa v presenteri by to takto malo v pohode ist nie?
		$this->userManager->changePassword($this->user->getIdentity()->username, $values->password);
		...
	}
}
?>
David Matějka
Moderator | 6445
+
0
-

pro @inject musi byt ta clenska promenna public

Matey
Člen | 142
+
0
-

ďakujem, to som si nejak neuvedomil, alebo skôr ani nevedel..
btw je to dobré riešenie cez ten inject do public? v rámci bezpečnosti alebo tak :)

David Matějka
Moderator | 6445
+
0
-

@Matey: ano, neboj se toho :) v presenterech je to doporucene reseni. Public to musi byt proto, ze se ty zavislosti „vstrikavaji“ zvenku. Ale nepouzivej to jinde nez v presenterech – jinde radeji pouzij konstruktor injection.
Muzes kouknout do cheatsheetu o di (zatim to neni dokonceny)

Matey
Člen | 142
+
0
-

ale vyzerá to dobre a hlavne to obsahuje dobré info :) myslím že som v dokumentácii nenarazil na doporučenie, čo kde využívať, gj

Editoval Matey (27. 2. 2014 18:46)

Šaman
Člen | 2666
+
0
-

Aurowiring pro property injection (anotace a public property) a pro method injection (injectFoo()) funguje (v Nette 2.1.x) jen u presenterů.
Constuctor injection funguje i u obecných služeb.