Call to a member function login() on null
- petr_tricek
- Člen | 7
Ahoj,
mám tento kód v BasePresenter ale najednou z ničeho nic mi to začalo hlásit chybu Call to a member function login() on null. Nevíte prosím někdo co s tím? Zkoušel jsem snad už vše :(
Díky
<?php
declare(strict_types=1);
namespace FrontModule;
use Nette;
use App\Model;
use Nette\Application\UI;
use Nette\Mail\Message;
use Nette\Mail\SendmailMailer;
use Nette\Application\UI\Form;
use Nette\Security\Passwords;
use Nette\Security\User;
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
/** @var \Nette\Security\User @inject */
private $user;
/** @persistent */
public $backlink = '';
/** @var \Nette\Database\Context @inject */
private $database;
/** @var Model\UserManager */
private $userManager;
/** @var Passwords */
private $passwords;
public function __construct(Nette\Database\Context $database, User $user, Model\UserManager $userManager, Passwords $passwords) {
$this->database = $database;
$this->userManager = $userManager;
$this->passwords = $passwords;
$this->user = $user;
}
protected function createComponentSignInForm()
{
$form = new Form;
$form->getElementPrototype()->class('ajax');
$form->addText('email', 'Uživatel:')
->setRequired('Zadejte prosím přihlašovací údaje')
->setAttribute('placeholder', 'Uživatelské jméno');
$form->addPassword('password', 'Heslo:')
->setRequired('Zadejte prosím přihlašovací údaje')
->setAttribute('placeholder', 'Heslo');
$form->addSubmit('send', 'Přihlásit')->setAttribute('class', 'primary-big-button');
$form->onSuccess[] = [$this, 'signInFormSucceeded'];
$form->onError[] = function (Form $form) {
if ($this->presenter->isAjax()) {
$this->redrawControl('sign_in_form');
}
};
return $form;
}
public function signInFormSucceeded(UI\Form $form, $values)
{
try {
$this->user->login($values["email"], $values["password"]);
$this->redirect('Homepage:default');
} catch (Nette\Security\AuthenticationException $e) {
$form->addError('E-mail nebo heslo je chybné.');
return;
}
}
}
- petr_tricek
- Člen | 7
CZechBoY napsal(a):
$user je uz v nette presenteru, neni potreba ho injectovat rucne
Dobře, nicméně hlásí mi to na všechny funkce a to třeba i na Call to a member function table() on null. Fakt nechápu, fungovalo to a najednou ne :(
- Marek Bartoš
- Nette Blogger | 1274
/** @var \Nette\Security\User @inject */ private $user;
Tohle ti nemohlo nikdy fungovat, @inject
anotace je jen pro
public properties.
Nette\Application\UI\Presenter
má magic property
$this->user
(volající $this->getUser()
). Smaž
svou property a místo toho použij tu, co už tam je.
- petr_tricek
- Člen | 7
Mabar napsal(a):
/** @var \Nette\Security\User @inject */ private $user;
Tohle ti nemohlo nikdy fungovat,
@inject
anotace je jen pro public properties.
Nette\Application\UI\Presenter
má magic property$this->user
(volající$this->getUser()
). Smaž svou property a místo toho použij tu, co už tam je.
Díky. To už zabralo. Také to ale hlásí Call to a member function table() on null při dotazu na databázi. Tam ale private $database; odstranit asi nemůžu ne?
- Marek Bartoš
- Nette Blogger | 1274
private změníš na public, protože jen s public properties funguje anotace inject.
- petr_tricek
- Člen | 7
Mabar napsal(a):
private změníš na public, protože jen s public properties funguje anotace inject.
Díky. Nicméně tam bude někde něco špatně a já vůbec nevím co. Ať změním cokoliv tak se to vyřeší a hned vyskočí něco jiného. Teď třeba Call to a member function add() on null což je třída v UserManager. Nicméně i když cokoliv změním na public tak se nic neděje. @injet atd.. jsem přidával až v momentě, kde všechno přestalo fungovat :(
- David Matějka
- Moderator | 6445
pravděpodobně si v nějakým konkretním presenteru překryl konstruktor
BasePresenteru, takže ti to nevložilo závislosti. v base presenteru
používej @inject
property s public accessem
- petr_tricek
- Člen | 7
David Matějka napsal(a):
pravděpodobně si v nějakým konkretním presenteru překryl konstruktor BasePresenteru, takže ti to nevložilo závislosti. v base presenteru používej
@inject
property s public accessem
Díky. Přesně jak píšeš, v jiném presenteru jsem omylem překryl konstruktor :(