logo

Palette - Make it Colorful🎨

Palette - Visual Page Builder, no design degree required.

Live Demo Download Palette

Scroll

Մուտքի ստուգում + պահպանում (կեշավորություն)

19/06/2025, by Ivan

Մուտքի ստուգման գործիքները երթուղու համար, hook_entity_access() և այլ բոլոր մեթոդները, որոնք պետք է վերադարձնեն AccessResultInterface օբյեկտ, պետք է ավելացնեն համապատասխան կեշավորման մետատվյալներ։

Եթե դեռ չեք կարդացել, կարդացեք կեշի նշանները (cache tags), կեշի կոնտեքստները (cache contexts) և max-age մասին։

Մուտքի ստուգման պարամետրեր

Մուտքի ստուգման գործիքը կստանա տարբեր պարամետրեր՝ նվազագույնը օգտվողի հաշիվ (AccountInterface) և հաճախ օբյեկտ։ Այնուհետև կկատարի որոշում այդ պարամետրերի հատկությունների հիման վրա։

Եթե $parameter-ի որևէ մի հատկանիշի փոփոխությունը կփոխի մուտքի արդյունքը, պետք է ավելացվի կեշավորման կախվածություն $parameter-ից։

Օրինակ՝

$access_result = AccessResult::allowedIf($node->isPublished())
  // Մուտքի արդյունքը կախված է օբյեկտի այն հատկությունից, որը կարող է փոխվել՝ այդ պատճառով ավելացնում ենք կեշավորման կախվածություն։
  ->addCacheableDependency($node);

Մյուս տարածված դեպքը, երբ մուտքի արդյունքը կախված է հատկությունից, որը չփոխվի (օրինակ՝ նույնականիչ, UUID): Օրինակ՝ մուտք թույլատրել, եթե տվյալ օգտվողի հաշիվը հանդիսանում է օբյեկտի տերը՝

$access_result = AccessResult::allowedIf($node->getOwnerId() === $account->id())
  // Մուտքի արդյունքը կախված է կետից՝ տերը կարող է փոխվել։
  ->addCacheableDependency($node);

// Մուտքի արդյունքը նաև կախված է օգտվողի հաշվից, և օգտվողի հաշվի ID-ն երբեք չի փոխվի։ Ուստի, $account-ը կեշավորման կախվածություն ավելացնելու կարիք չկա։

// Սակայն, եթե $account-ը ներկա օգտվողն է, և ոչ մի կոդավորված օգտվող, ապա պետք է ապահովենք, որ մուտքի ստուգումը կատարվի յուրաքանչյուր օգտվողի համար տարբերակված, որպեսզի արդյունքը չկրկնօրինակվի բոլոր օգտվողների համար։
if ($account->id() === \Drupal::currentUser()->id()) {
  $access_result->cachePerUser();
}