NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Lukáš Novák:6.7.2017 17:40

Zdravím, potřeboval bych trošku pomoct s jedním takovým problémem. V autentikaci uživatelů mám podmínky, kde se testuje, jestli uživatel nemá ban a popřípadě jaký.

if($user->ban->permanent !== 0) throw new AuthenticationException($this->translator->translate('exception.banPermanent'));

if($user->ban->banUntil > new \DateTime()) throw new AuthenticationException($this->translator->translate('exception.banUntil' . $user->ban->banUntil->Format('j.n.Y H:i')));

zkoušel jsem nahradit i $user->ban... z přímo za $user->permanent, ale pořád nic.
Mám entitu User s vazbou OneToOne na ban, který má právě vlastnosti permanent, banuntil atd...
Chci se zeptat, jak se můžu dotázat na tuto entitu.
Když mám kód
$user->ban->permanent, tak dostanu chybovou hlášku
"Cannot read non-object ..."
, ale když dám $user->permanent, tak dostanu
"Cannot read an undeclared property App\Model\Enti­ties\User::$per­manent."
Mohli byste mi prosím poradit?

 
Odpovědět
6.7.2017 17:40
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na Lukáš Novák
TomasGlawaty:6.7.2017 17:56

Ahoj,
proměnné User::$ban, či Ban::$permanent atd. máš určitě deklarované jako private.
Musíš k nim dopsat settery a volat například $user->getBan()->isPermanent(). Dále se ujisti, že v proměnné $user máš skutečně isntanci tvé Entity.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
6.7.2017 17:56
Avatar
Lukáš Novák:6.7.2017 18:17

Ahoj, mohl by ses prosím podívat na následují kódy a zkusit najít chybu? Já už z toho mám nerva :)
User entita:

/*
 * @ORM\Entity
 * @ORM\Table(name="users")
 */
final class User extends BaseEntity
{
    /**
     * @ORM\OneToOne(targetEntity="Ban", mappedBy="user")
     */
    public $ban;
...

ban entita:

 /*
  * @ORM\Entity
  * @ORM\Table(name="bans")
  */
final class Ban extends BaseEntity
{
...
    /**
     * @ORM\OneToOne(targetEntity="User", inversedBy="ban")
     */
    public $user;
    /**
     * @ORM\Column(type="integer", length=1)
     */
    protected $permanent;

    /**
     * @return bool
     */
    public function isPermanent()
    {
        return $this->permanent === 1;
    }

autentikace:

...
        if($user->ban->isPermanent()) throw new AuthenticationException($this->translator->translate('exception.banPermanent'));
...

Chybová hláška: Call to a member function isPermanent() on null

Editováno 6.7.2017 18:18
 
Nahoru Odpovědět
6.7.2017 18:17
Avatar
Peter Trcka
Člen
Avatar
Peter Trcka:6.7.2017 19:24

ahoj a mas v User classe niekde inicializaciu

$ban = New Ban();
 
Nahoru Odpovědět
6.7.2017 19:24
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na Lukáš Novák
TomasGlawaty:6.7.2017 21:37
/**
 * @ORM\Entity
 */
final class User
{
        use \Kdyby\Doctrine\Entities\Attributes\Identifier;

        /**
         * @ORM\OneToOne(targetEntity="Ban", cascade={"persist"})
         * @var Ban
         */
        private $ban;

        public function __construct()
        {
                $this->ban = new Ban();
        }

        public function getBan()
        {
                return $this->ban;
        }
}

/**
 * @ORM\Entity
 */
final class Ban
{
        /**
         * @ORM\Column(type="boolean")
         * @var bool
         */
        private $permanent = FALSE;

        public function isPermanent()
        {
                return $this->permanent;
        }

        public function setPermanent($permanent)
        {
                $this->permanent = (bool) $permanent;
        }
}

Trochu jsem ti to opravil, ale psal jsem to tady, takže je možné, že tam je nějaké překlep.
Upravil jsem:

  • type u permanent property - doctrine má přímo typ boolean
  • access u property ban na private => entity Ban by neměla jít nasetovat zvenčí
  • mezi entitami jsem použil vazbu "unidirectional" OneToOne - entita Ban nemusí vědět o svém Userovi, stačí že User ví o Ban. viz. ODKAZ ZDE
  • přidal jsem cascade={"persist"} => při persistování entity Usera se ti automaticky persistne i jeho entita Ban
  • v constructoru Usera se ihned vytvoří entita Ban.
  • nevím co vše je v BaseEntity, ale pokud jen ID, tak je lepší řešení použít daný trait (jsme v sekci Nette tak počítám s tím, že používáš kdyby/doctrine

Doporučuji ti si prostudovat dokumentaci Doctrine a při psaní entit (zejména asociací mezi entitami) mít ji otevřenou, než se do toho vžiješ :)
ASOCIACE
DATOVÉ TYPY

 
Nahoru Odpovědět
6.7.2017 21:37
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.