[Nette 2] Service, Cache – jak vytvořit „cachovanou službu“
- carlos
- Člen | 4
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
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
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“.