Error po nastavení anotací @inject
- kiCkZ
- Člen | 153
Zdravím,
nevíte někdo proč mi to hlásí tohle:
Call to a member function update() on null
UserFormFactory.php
<?php
namespace AdminModule\Forms;
use Nette;
use Nette\Application\UI\Form;
class UserFormFactory {
use Nette\SmartObject;
/** @var \AdminModule\Model\UserManager @inject */
private $userManager;
public function profile() {
$form = new Form;
$form->addText('username','Přihlašovací jméno: ')
->setRequired();
// ->addRule([$this,'checkUsername'],'Uživatelské jméno už existuje.');
$form->addEmail('email','E-mail: ')
->setRequired();
// ->addRule([$this,'checkEmail'],'Email už existuje.');
$form->addPassword('password','Heslo: ')
->addRule(Form::MIN_LENGTH,'Položka musí obsahovat minimálně %d znaků',3)
->setRequired(FALSE);
$form->addPassword('newpassword','Nové heslo: ')
->addRule(Form::MIN_LENGTH,'Položka musí obsahovat minimálně %d znaků',3)
->setRequired(FALSE);
$form->addPassword('verifypassword','Potvrzení hesla: ')
->addRule(Form::MIN_LENGTH,'Položka musí obsahovat minimálně %d znaků',3)
->addRule(Form::EQUAL,'Hesla se musí shodovat!',$form['newpassword'])
->setRequired(FALSE);
$form->addSubmit('save','Uložit');
return $form;
}
}
UserManager.php
namespace AdminModule\Model;
use Nette,
Nette\Security\Passwords,
AdminModule\Model\BadPasswordException;
class UserManager {
use Nette\SmartObject;
const
TABLE_NAME = 'users',
COLUMN_ID = 'id',
COLUMN_NAME = 'username',
COLUMN_PASSWORD_HASH = 'password',
COLUMN_EMAIL = 'email',
COLUMN_ROLE = 'role';
private $database;
private $user;
public function __construct(\Nette\Database\Context $database, Nette\Security\User $user) {
$this->database = $database;
$this->user = $user;
}
public function get() {
return $this->database->table(self::TABLE_NAME)->where('id',$this->user->getIdentity()->id)->fetch();
}
}
Editoval kiCkZ (28. 8. 2017 21:41)
- kiCkZ
- Člen | 153
pavel4 napsal(a):
Anotace @inject bude fungovat jenom v presenteru. Musíš si UserManagera poslat přes konstruktor.
Dal jsem si jí i do presenteru a mam úplně stejnou hlášku.
Call to a member function show() on null
namespace AdminModule\Presenters;
use Nette\Application\UI\Form,
Nette\Utils\Html;
class UserPresenter extends BasePresenter {
/** @var \AdminModule\Model\UserManager @inject */
private $userManager;
public function createComponentProfileForm() {
$form = new Form;
$data = $this->userManager->show();
$form->addText('username','Přihlašovací jméno: ')
->setRequired()
->setDefaultValue($data['username'])
->addRule([$this,'checkUsername'],'Uživatelské jméno už existuje.');
$form->addEmail('email','E-mail: ')
->setRequired()
->setDefaultValue($data['email'])
->addRule([$this,'checkEmail'],'Email už existuje.');
$form->addPassword('password','Heslo: ')
->addRule(Form::MIN_LENGTH,'Položka musí obsahovat minimálně %d znaků',3)
->setRequired(FALSE);
$form->addPassword('newpassword','Nové heslo: ')
->addRule(Form::MIN_LENGTH,'Položka musí obsahovat minimálně %d znaků',3)
->setRequired(FALSE);
$form->addPassword('verifypassword','Potvrzení hesla: ')
->addRule(Form::MIN_LENGTH,'Položka musí obsahovat minimálně %d znaků',3)
->addRule(Form::EQUAL,'Hesla se musí shodovat!',$form['newpassword'])
->setRequired(FALSE);
$form->addSubmit('save','Uložit');
$form->onSuccess[] = [$this,'profileFormSucceeded'];
return $form;
}
}
Editoval kiCkZ (29. 8. 2017 8:37)
- nightfish
- Člen | 519
kiCkZ napsal(a):
pavel4 napsal(a):
Anotace @inject bude fungovat jenom v presenteru. Musíš si UserManagera poslat přes konstruktor.
Dal jsem si jí i do presenteru a mam úplně stejnou hlášku.
Proměnná, do které inject
uješ, musí být
public
. Další informace o předávání závislostí najdeš
v dokumentaci
- kiCkZ
- Člen | 153
nightfish napsal(a):
kiCkZ napsal(a):
pavel4 napsal(a):
Anotace @inject bude fungovat jenom v presenteru. Musíš si UserManagera poslat přes konstruktor.
Dal jsem si jí i do presenteru a mam úplně stejnou hlášku.
Proměnná, do které
inject
uješ, musí býtpublic
. Další informace o předávání závislostí najdeš v dokumentaci
Je tam někde vůbec zmíňka o tom, že to musí být public ?
Jinak to lze dávat jen do presenterů jo ?
- Pavel Kravčík
- Člen | 1196
Ano, je. https://doc.nette.org/…dependencies#…
Ano, dalo by se to rozchodit i pro ostatní – nedoporučuje se však.
- nightfish
- Člen | 519
kiCkZ napsal(a):
Je tam někde vůbec zmíňka o tom, že to musí být public ?
Jinak to lze dávat jen do presenterů jo ?
Nejlepší bude, když si přečteš celou tu stránku dokumentace, pěkně
od začátku. Tam se zaprvé dočteš, že to musí být public
(hned v prvním čtyřbodovém seznamu) a taky se dozvíš o ostatních
metodách, jejich výhodách i nevýhodách.
- Tomáš Votruba
- Moderator | 1114
Anotaci @inject
má smysl dávat jen do
Abstract/Base
tříd. Jedině tam má přidanou hodnotu a usnadní
ti předávání závislostí u potomků.
Kdekoliv jinde je lepší použít constructor injection.
Tip: Pokud ji používáš na mnoha místech, můžeš použitý tenhle Fixer, který to opraví za tebe.
- GEpic
- Člen | 566
Ona je hlavně chyba v dokumentaci:
/** @var \App\Service1 @inject */
private $service1;
/** @var \App\Service2 @inject */
private $service2;
EDIT:
fixnuto
Editoval GEpic (29. 8. 2017 13:06)