[Nette 2] Service, Cache – jak vytvořit „cachovanou službu“

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
carlos
Člen | 4
+
0
-

Jak udělat službu, která se bude načítat z cache?

Příklad:
v confing.neon
authorizator: Carlos\Security\ACL, provadí zbytečné dotazy, které mohou být uloženy v cache.

Když upravím v tempu ve vygenerovaném SystemContaineru vytvoření service na:

protected function createServiceAuthorizator()
{
    $cache = $this->getService('cache');
    $acl = $cache->load("acl");
    if ($acl == null) {
        $acl = new Carlos\Security\ACL($this->getService('aclFacade'));
        $cache->save("acl", $acl, array(
                $cache::EXPIRATION => '1 month',
                $cache::TAGS => array('acl/list')
               )
            );
        }
        return $acl;
}

tak sice dosáhnu tíženého výsledku, ale nějak se mě nedaří toto napsat, aby se služba vytvořila sama tímto způsobem a nebyla to jen dočasná úprava TMP souboru.

Díky za rady, zatím tak testuji, tak snad to není příliš dummy dotaz.

David Matějka
Moderator | 6445
+
0
-

o cache by se mela postarat ta trida Carlos\Security\ACL.. takze ji predej v konstruktoru Cache (pripadne cache storage a cache si tam vytvor i s vlastnim namespace, aspon to budes mit oddeleny..) a do cache ukladat jen data..

carlos
Člen | 4
+
0
-

Takže obecně je lepší předat Cache do třídy a v ní nacahovat vybrané části, než celý objekt?

Udělal jsem to tedy teď tímto způsobem (zjednodušeno):

function __construct(ACLFacade $model, Cache $cache) {

	//.....

 	//zdroje
        $resourcesKey = self::ACL_CACHE_PREFIX . "-resources";
        $resourcesValue = $cache->load($resourcesKey);
        if ($resourcesValue == null) {
            $resourcesValue = $model->getResources();
            $cache->save($resourcesKey, $resourcesValue, array(
                Cache::EXPIRATION => self::ACL_CACHE_EXPIRE,
                Cache::TAGS => array(self::ACL_CACHE_PREFIX)
                )
            );
        }
        //nastaveni zdroju
        foreach ($resourcesValue as $resource) {
            $this->addResource($resource->resource, $resource->parent_resource);
        }

	// ....
}

V tomto případě je ale běh pomalejší, u mě na lokále místo cca 500ms, tak 1500ms :-(.
Ale teoreticky by to šlo nacahovat celou třídu a pak jí použit jako service? Případně, kde by se to hodilo tak udělat jestli to není „prasárna“.

jtousek
Člen | 951
+
0
-

Můžeš službu vytvářet pomocí factory method. Pokud je v cache tak prostě natáhne hotový objekt, pokud ne tak jej vytvoří.

Příklad z dokumentace:

services:
    database:
        class: Nette\Database\Connection
        factory: DbFactory::createConnection
Filip Procházka
Moderator | 4668
+
0
-

Je libo automaticky cachovat všechna volání nad třídou? :)

https://github.com/…ecorator.php