Call to a member function login() on null

petr_tricek
Člen | 7
+
0
-

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;
		}
	}
}
CZechBoY
Člen | 3608
+
0
-

$user je uz v nette presenteru, neni potreba ho injectovat rucne

petr_tricek
Člen | 7
+
0
-

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 | 1143
+
0
-
	/** @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
+
0
-

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

private změníš na public, protože jen s public properties funguje anotace inject.

CZechBoY
Člen | 3608
+
0
-

Ma v tom bordel… pouziva zaroven konstruktor a zaroven @inject, ale nad private property.
Podle me se ti to rozbilo protoze nekde nevolas parent::__construct

petr_tricek
Člen | 7
+
0
-

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

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

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 :(