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.
- Matey
- Člen | 142
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
@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)