Settery a gettery v modelu
- gizer
- Člen | 67
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)
- h4kuna
- Backer | 740
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
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)
- gizer
- Člen | 67
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)
- emololftw
- Člen | 82
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
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.