+1

Cache Context Drupal 8 — Part 2

Trong bài Cache Context — Part 1, chúng ta đã nói về cache context là gì và nó khác gì với cache context trong Drupal core. Ở bài này chứng ta sẽ tạo một cache context vì chứng ta là một Drupal developers mà, và chứng ta thích code hoặc muốn tùy chỉnh nhiều thứ 😄

Problem statement —Trang web lưu trữ màu ưa thích của người dùng. Để đơn giản, chúng tôi giả sử rằng thông tin màu ưa thích sẽ được lưu trữ trong tiểu sử người dùng với danh sách lựa chọn văn bản. Khách hàng muốn hiển thị màu sắc yêu thích của người dùng hiện tại trong một khối với bộ nhớ đệm thích hợp cho nó.

Solution — Chúng tôi sẽ tạo một khối hiển thị màu sắc yêu thích của người dùng và cache context tùy chỉnh dựa trên màu ưa thích của người dùng. Để tạo một cache context, chúng ta cần phải đăng ký dịch vụ với thẻ 'cache.context' trong vùng chứa.

<?php
//cache-context-block.php
namespace Drupal\rohit\Plugin\Block;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Cache\Cache;
use Drupal\user\Entity\User;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
 * Provides a block to display 'Site branding' elements.
 *
 * @Block(
 *   id = "user_favorite_color_block",
 *   admin_label = @Translation("User favorite color")
 * )
 */
class UserFavoriteColorBlock extends BlockBase {
  /**
   * {@inheritdoc}
   */
  public function build() {
    $build = array();
    $current_user_id = \Drupal::currentUser()->id();
    // Load user object.
    $user = User::load($current_user_id);
    $favorite_color = $user->get('field_favorite_color')->getValue()[0]['value'];
    $build['rohit'] = array(
      '#markup' => 'User favorite color is ' . $favorite_color,
    );
    return $build;
  }
  /**
   * {@inheritdoc}
   */
  public function getCacheContexts() {
    return Cache::mergeContexts(
      parent::getCacheContexts(),
      ['user_favorite_color']
      );
  }
}
<?php
//cache-context-rohit.php
namespace Drupal\rohit\CacheContext;
use Drupal\Core\Cache\Context\CacheContextInterface;
use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\user\Entity\User;
class UserFavoriteColorCacheContext implements CacheContextInterface {
  /**
   * @var \Drupal\Core\Session\AccountProxyInterface
   */
  protected $currentUser;
  public function __construct(AccountProxyInterface $current_user) {
      $this->currentUser = $current_user;
  }
  /**
   * {@inheritdoc}
   */
  public static function getLabel() {
    return t('User favorite color cache context');
  }
  /**
  * {@inheritdoc}
  */
  public function getContext() {
    $current_user_id = $this->currentUser->getAccount()->id();
    // Load user object.
    $user = User::load($current_user_id);
    $favorite_color = $user->get('field_favorite_color')->getValue()[0]['value'];
    return $favorite_color;
  }
  /**
  * {@inheritdoc}
  */
  public function getCacheableMetadata() {
    return new CacheableMetadata();
  }
}
#cache-context-service.yml
services:
  cache_context.user_favorite_color:
    class: Drupal\rohit\CacheContext\UserFavoriteColorCacheContext
    arguments: ['@current_user']
    tags:
      - { name: cache.context }
  cache_context.my_cache_context:
    class: Drupal\rohit\CacheContext\MyCacheContextClass
    arguments: []
    tags:
      - { name: cache_context }

Thao tác này sẽ đăng ký một cache context mới user_favorite_color cho Drupal. Điều quan trọng là tên dịch vụ. Không giống như các dịch vụ bình thường khác, tên dịch vụ cache context cần phải ở định dạng cụ thể nếu không nó sẽ không hoạt động và đó là trường hợp tôi vẫy đầu trong 2-3 giờ tại sao context tùy chỉnh của tôi không hoạt động.

Tên dịch vụ phải đặt trước với cache_context và sau đó là tên cache context trong trường hợp này nó sẽ là user_favorite_color và do đó tên dịch vụ là 'cache_context.user_favorite_color'. Phần khó khăn đã được thực hiện. Sau đó chúng ta chỉ thực hiện lớp cache context này.

Chúng ta cần phải thực hiện các CacheContextInterface (hoặc bất kỳ lớp cơ sở) và thực hiện các phương pháp của nó. getLabel () chỉ cung cấp mô tả cache context. getCachebaleMetaData () được sử dụng để thêm bất kỳ metadata lưu trữ khác nếu chúng ta muốn / yêu cầu. Phương pháp kỳ diệu là getContext () chứa logic thực tế của biến thể của chúng ta. Nó đơn giản trả về chuỗi và dựa trên chuỗi này, các biến thể bộ nhớ cache khác nhau sẽ được tạo ra. Bây giờ chúng tôi đã tạo ra cache context tuỳ chỉnh của chúng tôi và bây giờ chúng tôi sẽ sử dụng nó. Đối với điều này chúng tôi đã tạo một khối tùy chỉnh sẽ hiển thị màu yêu thích của người dùng hiện tại (xem mã trên).

Phương thức UserFavoriteColorBlock :: build () chỉ được sử dụng cho những gì cần được render. Quan trọng ở đây là UserFavoriteColorBlock :: getCacheContext (). Ở đây chúng tôi đang hợp nhất cache context tùy chỉnh của chúng tôi (user_favorite_color) với một khung hiện có để chúng tôi không chỉ ghi đè lên các thông tin hiện có.

Chúng ta có thể kiểm tra / xác minh xem context đã được thêm vào hay không trong công cụ dev của Chrome -

Nếu bạn không muốn động tay trong việc tạo ra tất cả các tệp này (đối với cache context), bạn có thể sử dụng Drupal Console để tạo ra điều đó cho bạn. Tất cả bạn phải làm nó chỉ cần chạy lệnh và làm theo hướng dẫn trong lệnh.

$ drupal generate:cache:context

Tham khảo


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.