Settery a gettery v modelu

gizer
Člen | 67
+
0
-

Zdravím všechny,

opět tu zápasím se začátečnickou chybou. Vytvořil jsem si setter a getter v modelu.

Metoda setAcces i getAccess je přístupná přes DI a volám ji z více presenterů. S tím není problém. Jde mně však o to, že když nastavím proměnnou $this->access v metodě setAccess na nějakou int hodnotu, tak $this->access v metodě getAccess je NULL.

Jakým jiným způsobem mohu tedy nastavit a následně číst hodnotu proměnné $access v modelu? Kde dělám chybu? Děkuji moc za případné rady.

Model
class AccessManager
{
    use SmartObject;

    /** declaration */
    private $access = 0;


    /*Setter*/
    public function setAccess( int $access):void
    {
        $this->access = $access;
        //bdump($this->access);
    }

   /* Getter*/
    public function getAccess():int
    {

        bdump($this->access);
        return $this->access;
    }

}

Editoval gizer (14. 2. 2022 15:09)

MajklNajt
Člen | 471
+
0
-
  1. ako inštancuješ AccessManager? cez DI či ručne pomocou new AccessManager()?
  2. setAccess() a getAccess() voláš na tej istej inštancií a v rámci toho istého requestu?

Editoval MajklNajt (14. 2. 2022 15:47)

h4kuna
Backer | 740
+
0
-

Ukaž jak to voláš. V definici třída chyba není. Vtipný je, jak ti to může dávat null, když setter je typový a vlastnost objektu má výchozí 0. Není jak by se tam null dostal.

Fungovat bude:

$accessManager = new AccessManager;
echo $accessManager->getAccess(); // 0
$accessManager->setAccess(5);
echo $accessManager->getAccess(); // 5

Editoval h4kuna (14. 2. 2022 15:58)

gizer
Člen | 67
+
0
-

Ten null jsem ještě upravil nakonec na nulu. Takže opravuji. V metodě getAccess() dostávám nulu. Pokud ji v deklaraci nenastavím, tak NULL.

Takto to vypadá v HomepagePresenter, kde instancuji a volám metodu setAcces() v modelu a nastavuji hodnoty 100,200 atd.. To volání funguje. Posílám aktuální část kódu.

Nechápu pouze, proč je hodnota proměnné $this->access modelu v metodě pro setAccess() a getAccess() rozdílná?

declare(strict_types=1);

namespace App\FrontModule\Presenters;
use Nette;
use Nette\Application\UI\Form;
use  Nette\Http\Session;
use Nette\Http\SessionSection;
use App\FrontModule\Model\AccessManager;
final class HomepagePresenter extends BaseFrontPresenter
{
    /** @var Nette\Database\Context */
    protected $database;
    public  $session;
    public $access;

    public function __construct(Nette\Database\Context $database, Session $session, AccessManager $access)
    {
        $this->database = $database;
        $this->session = $session;
        $this->access =  $access;
        parent::__construct($database);

    }

    protected function createComponentRedirectMainForm()
    {
        /** Create a redirect main form */
        $form = new Form;
        $form->addtext('checknumb', 'Zadejte prosím číslo série, kterou najdete na poukazu nebo šeku:');
        $form->addSubmit('send', 'Odeslat');
        $form->onSuccess[] = [$this, 'TestFormSucceeded'];
        return $form;
    }

    public function TestFormSucceeded(Form $form, \stdClass $values)
    {

        /** Definition section serial of the session */
        $section = $this->getSession('serial');
        $section->serial = $values->checknumb;


        if ($section->serial == 100)
        {
            $this->access->setAccess(100);
            $this->redirect('Checkinfo:checkinfo');

        }
        elseif ($section->serial == 200)
        {
            $this->access->setAccess(200);
            $this->redirect('Beerinfo:beerinfo');

        }

.....
.....



V common.neon potom


services:
	- App\FrontModule\Model\AccessManager

Editoval gizer (14. 2. 2022 16:18)

Marek Bartoš
Nette Blogger | 1166
+
0
-

a getAccess() voláš kde?

gizer
Člen | 67
+
0
-

Jednoduše střídavě dumpuji proměnnou $this->access v modelu v jedné a pak v druhé metodě. A dostávám rozdílné hodnoty. Proč, nevím ?

gizer
Člen | 67
+
0
-

Ještě posílám getAcces().

<?php

declare(strict_types=1);

namespace App\FrontModule\Presenters;

use Nette;
use App\FrontModule\Model\AccessManager;
use Nette\Http\Session;

class CheckinfoPresenter extends BaseFrontPresenter
{

    /** @var Nette\Database\Context */
    protected $database;
    public $access;

    public function __construct(Nette\Database\Context $database, AccessManager $access)
    {
        $this->database = $database;
        $this->access =  $access;
        parent::__construct($database);

    }

    public function actionCheckinfo()
    {
        $acc = $this->access->getAccess();
        bdump($acc);
      if (! $acc == 100)
        $this->redirect('Homepage:default');
    }

    public function renderCheckinfo(): void
    {
        $this->template->backlink =  $this->backlink;
        $this->template->selfLink = $this->link('this');
        $this->template->post = $this->database->table('posts')->get(1);
        $this->template->informations = $this->database->table('informations')->get(1);
    }

}

Editoval gizer (14. 2. 2022 16:25)

gizer
Člen | 67
+
0
-

Ale ta metoda v modelu už stejně vrací pouze nulu nebo NULL (podle deklarace). Volání metody opět funguje.

MajklNajt
Člen | 471
+
0
-

Podľa mňa to nevoláš v jednom requeste, a keďže tu hodnotu nikde neukladáš, tak pri každom requeste má na začiatku ten access východziu hodnotu, t.j. 0 alebo null…

gizer
Člen | 67
+
0
-

To by mohlo být jádro problému. Nevolám to opravdu v jednom requestu. A jak to můžu pořešit? persistentní proměnná? Nebo to zapsat do DB a náslewdně přečíst?

gizer
Člen | 67
+
0
-

Nebo v tomto případě to možná zkusit uložit do session?

MajklNajt
Člen | 471
+
0
-

Obe možnosti sú možné, záleží, či to tam potrebuješ uchovávať na dlho alebo len dočasne pre danú reláciu

gizer
Člen | 67
+
0
-

OK, zatím děkuji za rady. Zkusím jít tou cestou session relace a uvidíme.

emololftw
Člen | 81
+
0
-

gizer napsal(a):

To by mohlo být jádro problému. Nevolám to opravdu v jednom requestu. A jak to můžu pořešit? persistentní proměnná? Nebo to zapsat do DB a náslewdně přečíst?

Předávát persistentním parametrem práva uživatele (pokud jsem to z příspěvku správně pochopil) asi není ideální. Co zkusit parametr uložit do databáze (např. tabulka permissions_x_users), kde budou jednotlivé oprávnění přiřazeny k uživateli a v každém requestu (později např. i cachovat) si vytáhnout data z databáze a ty kontrolovat (pro základní otestování klidně v metodě startup)

gizer
Člen | 67
+
0
-

Vyřešil jsem problém pomocí session. Tabulka v databázi v mém případě nic neřeší. Nejedná se totiž o běžné přihlášené uživatele. Admin zónu řeším standardním způsobem pomocí oprávnění. Tady jen omezuji všem přístup do jinak běžně přístupné front zóny. Takový specifický projekt.