Error po nastavení anotací @inject

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

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)

pavel_4
Člen | 13
+
+3
-

Anotace @inject bude fungovat jenom v presenteru. Musíš si UserManagera poslat přes konstruktor.

kiCkZ
Člen | 153
+
0
-

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

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é injectuješ, musí být public. Další informace o předávání závislostí najdeš v dokumentaci

kiCkZ
Člen | 153
+
0
-

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é injectuješ, musí být public. 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
+
+1
-

Ano, je. https://doc.nette.org/…dependencies#…
Ano, dalo by se to rozchodit i pro ostatní – nedoporučuje se však.

nightfish
Člen | 519
+
0
-

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.

premek_k
Člen | 172
+
+2
-

Kdysi udělal @DavidMatějka pro 2.3 tento tahák.

Tomáš Votruba
Moderator | 1114
+
+2
-

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

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)