Od 15. do 21.4. slevy 20 až 80% v sekci C/C++. Když ne teď, tak kdy?
Vyšlehej si extra vědomosti! Až 100% bodů na prémiový obsah zdarma! Více zde

Diskuze: Registrace nestatické funkce továrny do configu

Aktivity (1)
Avatar
Ondřej Pech
Člen
Avatar
Ondřej Pech:22. února 9:42

Ahopj, mám asi hloupej dotaz ale řeším oprávnění v nette aplikaci. Oprávnění potřebuju tahat z DB, jdu posle manuálu kde je popsáno toto:

<?php
namespace App\Model;

class AuthorizatorFactory
{
    /**
     * @return Nette\Security\Permission
     */
    public static function create()
    {
        $acl = new Nette\Security\Permission;

        // pokud chceme, můžeme role a zdroje načíst z databáze
        $acl->addRole('admin');
        $acl->addRole('guest');

        $acl->addResource('backend');

        $acl->allow('admin', 'backend');
        $acl->deny('guest', 'backend');

        // případ A: role admin má menší váhu než role guest
        $acl->addRole('john', ['admin', 'guest']);
        $acl->isAllowed('john', 'backend'); // false

        // případ B: role admin má větší váhu než guest
        $acl->addRole('mary', ['guest', 'admin']);
        $acl->isAllowed('mary', 'backend'); // true

        return $acl;
    }
}

A následně to mám zaregistrovat jako službu:

services:
    # třídu Permission vytvoříme metodou create třídy AuthorizatorFactory
    - App\Model\AuthorizatorFactory::create

A můj dotaz zní. Jak to zaregistrovat když nebudu chtít funkci create jako static? Protože potřebuju přistupovat k DI databázi a pod. a potřebuju použít $this->database ... což ve static funkci pochopitelně nejde.

 
Odpovědět 22. února 9:42
Avatar
Odpovídá na Ondřej Pech
Honza Prosecký:22. února 14:48

Bez ::create a pak klasicky vyzadani pres treba constructor, DI to vyresolvuje. Samozrejme musis zmenit z public static function na public function

 
Nahoru Odpovědět 22. února 14:48
Avatar
Roman Havránek:17. března 20:41

Proč je tato metoda static, když potřebuješ jiný objekt?

Pokud chceš ve Factorce přistupovat k objektu Nette/Context ($this->database), musíš si jí vytáhnout a vykonstruovat v konstruktoru této factory, nebo předat z volaného namespace.

Nahoru Odpovědět  -1 17. března 20:41
sleep();
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 3 zpráv z 3.