Náhrada @method v Nette 3

pista5
Člen | 60
+
0
-

Zdravim,
mel bych velkou prosbu… jsem zacatecnik a potrebuji upravit FreezyBee/MojeId pod Nette 3. Vim, ze musim vyhodit Nette\Object, ale nevim, jak si poradit s @method onRequest a onResponse
https://github.com/…zyBee/MojeId

Ac jsem prostudoval toto tema https://forum.nette.org/…ckych-method, nejsem z toho moc chytry.

Potrebuji poradit, jak to zde https://github.com/…c/MojeId.php nahradit:

<?php
namespace FreezyBee\MojeId;
use FreezyBee\MojeId\Exceptions\MojeIdException;
use Nette\Http\Request;
use Nette\Http\Response;
use Nette\Object;
use Nette\Utils\ArrayHash;

/**
 * Class MojeId
 * @package App\Model
 * @method onRequest(\Auth_OpenID_AuthRequest $authRequest)
 * @method onResponse(ArrayHash $person, \Auth_OpenID_ConsumerResponse $response)
 */
class MojeId extends Object
{
    /** @var callable[]  function (\Auth_OpenID_AuthRequest $authRequest); */
    public $onRequest = [];
    /** @var callable[]  function (ArrayHash $person, Auth_OpenID_ConsumerResponse $response); */
    public $onResponse = [];
.....

private function begin()
{
....
$this->onRequest($authRequest);
}
?>

Diky moc!

Marek Bartoš
Nette Blogger | 1146
+
0
-

@method je jen nápověda pro IDE a statickou analýzu, důežitá čast je to $on*. Stačí použít traitu SmartObject

Ten thread co jsi našel je o něčem jiném

Editoval Mabar (19. 11. 2019 13:27)

n3t
Člen | 37
+
0
-

Viz dokumentace
Pokud se nepletu, mělo by stačit přidat traitu SmartObject.

pista5
Člen | 60
+
0
-

Diky, dal jsem to a OK.

Narazil jsem ted ale zde https://github.com/…cs/Panel.php na toto:

<?php
    /**
     * @param $request
     */
    public function begin($request)
    {
        $this->request = ArrayHash::from($request);
    }
    /**
     * @param ArrayHash $person
     * @param \Auth_OpenID_SuccessResponse $response
     */
    public function complete(ArrayHash $person, \Auth_OpenID_SuccessResponse $response)
    {
        $this->person = $person;
        $this->response = ArrayHash::from($response);
    }
    /**
     * @param MojeId $mojeId
     */
    public function register(MojeId $mojeId)
    {
        $mojeId->onRequest[] = $this->begin;
        $mojeId->onResponse[] = $this->complete;
        Debugger::getBar()->addPanel($this);
    }
?>

kde mi to hlasi: Cannot read an undeclared property FreezyBee\MojeId\Diagnostics\Panel::$begin

Jestli dobre chapu, problem je v tom, ze $this->begin ma byt odkaz na metodu vyse… je spravne to nahradit $mojeId->onRequest[] = [$this, ‚begin‘]?

Marek Bartoš
Nette Blogger | 1146
+
0
-

Ano, je. Případně $mojeId->onRequest[] = function($request) {$this->begin($request);};

pista5
Člen | 60
+
0
-

Diky, udelal jsem prvni verzi, ktera mi prijde prehlednejsi, ale narazil jsem hned dal a tam uz si rady nevim.

Na

<?php
$this->request = ArrayHash::from($request);
?>

mi to vyhodi „Argument 1 passed to Nette\Utils\ArrayHash::from() must be of the type array, object given“

Zde vubec nechapu, kde se v metode „begin($request)“ bere parametr $request – a tudiz proc to tam haze tu chybu… vzdyt jsem pouze $this->begin nahradil za [$this, ‚begin‘]

Marek Bartoš
Nette Blogger | 1146
+
0
-

Předtím se nejspíš v ArrayHash přetypovával request na pole, teď pole striktně vyžaduje. Takže musíš request přetypovat na pole. Odkud se bere zjistíš pomocí IDE, například v phpstormu se volání metody dá zobrazit přes ctrl+b. Též si můžeš proměnnou dumpnout, abys zjistil o jaký objekt vlastně jde

pista5
Člen | 60
+
0
-

Diky, pretypovani pomohlo. Ctrl+b znam, ale zde mi nefunguje, kdyz je metoda Begin volana takto
$mojeId->onRequest[] = [$this, ‚begin‘]

Jinak diky moc za rady :)

Marek Bartoš
Nette Blogger | 1146
+
0
-

Ctrl+b znam, ale zde mi nefunguje, kdyz je metoda Begin volana takto $mojeId->onRequest[] = [$this, ‚begin‘]

Sorry, v tomhle případě hledáš onRequest() volání

Editoval Mabar (19. 11. 2019 22:30)