V PHP 8.0 nefunguje atribut #[Inject]

m.brecher
Generous Backer | 837
+
0
-

Ahoj, narazil jsem na tento problém:

Anotace @inject funguje:

abstract class ContentPresenter extends BasePresenter
{
    /** @inject */ public App\Model\NavigationModel $navModel;  // funguje

Metoda inject*() funguje také:

abstract class ContentPresenter extends BasePresenter
{
    public App\Model\NavigationModel $navModel;

    public function injectContent(App\Model\NavigationModel $navModel,)	// funguje
    {
        $this->navModel = $navModel;
    }

Atribut #[Inject] nefunguje, ale měl by, používám PHP 8.0 a poslední verzi Nette

abstract class ContentPresenter extends BasePresenter
{
    #[Inject] public App\Model\NavigationModel $navModel;   // nefunguje PHP 8.0, poslední verze Nette

Nette hlásí chybu v metodě beforeRender(): Typed property App\Presenters\ContentPresenter::$navModel must not be accessed before initialization

Nemá někdo nápad, kde by mohla být chyba?

Marek Bartoš
Nette Blogger | 1244
+
+1
-

Máš tam use statement? Atributy stejně jako třídy patří pod nějaký namespace.

m.brecher
Generous Backer | 837
+
0
-

@MarekBartoš – dík, to bude ono, nikde jsem atribut nedeklaroval, jenom použil takto:

declare(strict_types=1);

namespace App\Presenters;

use App;

abstract class ContentPresenter extends BasePresenter
{
    #[Inject] public App\Model\NavigationModel $navModel;   // todo:  zjistit proč toto mě nefunguje a mělo by !!
....

Půjdu si atributy nastudovat do PHP dokumentace ;)

nightfish
Člen | 506
+
+3
-

@m.brecher Potřebuješ use Nette\DI\Attributes\Inject; – viz https://doc.nette.org/…dependencies#…

m.brecher
Generous Backer | 837
+
+2
-

@nightfish Díky, mezitím mě to také napadlo, zkusil jsem našeptávač a navíc je to i v dokumentaci :)