Dịch vụ quản lý loại thực thể Drupal

Kho lưu trữ thực thể của Drupal có một phương thức loadByProperties để đơn giản hóa việc tải các thực thể dựa trên các điều kiện. Đối với các thực thể cấu hình, đây là các thuộc tính của chúng. Đối với các thực thể nội dung, đây là các giá trị trường của chúng. Nó là một sự chuyển giao phổ biến từ Drupal 7 ngày xưa với entity_load_multiple và đối số điều kiện thuộc tính

Chỉ có một vấn đề lớn. Phương pháp loadByProperties vô hiệu hóa kiểm tra quyền truy cập thực thể. Điều đó làm cho phương pháp này không an toàn và khiến phương pháp này vượt qua kiểm tra truy cập truy vấn thực thể

  public function loadByProperties[array $values = []] {
    // Build a query to fetch the entity IDs.
    $entity_query = $this->getQuery[];
    $entity_query->accessCheck[FALSE];
    $this->buildPropertyQuery[$entity_query, $values];
    $result = $entity_query->execute[];
    return $result ? $this->loadMultiple[$result] : [];
  }

Tài liệu của phương pháp cũng không xác định thực tế này. Tôi chắc chắn rằng điều này cũng đơn giản hóa quá trình di chuyển từ Drupal 7 sang Drupal 8 cho vô số dự án

  /**
   * Load entities by their property values.
   *
   * @param array $values
   *   An associative array where the keys are the property names and the
   *   values are the values those properties must have.
   *
   * @return \Drupal\Core\Entity\EntityInterface[]
   *   An array of entity objects indexed by their ids.
   */
  public function loadByProperties[array $values = []];

Drupal không cung cấp nhiều cho kiểm soát truy cập truy vấn thực thể ngay lập tức. Các nút có quyền truy cập và đó chỉ là về nó. Tuy nhiên, mô-đun API Thực thể cung cấp trình xử lý truy cập truy vấn được mô-đun Nhóm và mô-đun Thương mại tận dụng.  

Kiểm tra quyền truy cập thực thể ở cấp truy vấn có thể lọc ra các thực thể chưa được xuất bản mà người dùng hiện tại có thể không có quyền truy cập. Nó có thể lọc ra các gói của loại thực thể mà người dùng không có quyền truy cập. Nó có thể đảm bảo người dùng chỉ nhìn thấy thực thể của họ chứ không phải thực thể của người dùng khác

Trên thực tế, với Drupal 10, bạn phải chỉ định rõ ràng liệu truy vấn có nên hay không nên thực hiện kiểm tra quyền truy cập.  

Bạn nên làm gì nếu đang tận dụng loadByProperties?

Tạo một kho lưu trữ zip trong Drupal thật dễ dàng. Trước tiên, hãy đảm bảo rằng PHP của bạn được biên dịch với hỗ trợ ZIP, sau đó chuẩn bị thư mục nơi bạn muốn tạo tệp zip và cuối cùng tạo tệp zip

Trong ví dụ sau, tôi đang tạo một kho lưu trữ zip bằng cách thêm tệp đã tải lên vào trường field_file .

use Drupal\node\NodeInterface;
use Drupal\Core\File\FileSystemInterface;

function MY_MODULE_create_zip_file[NodeInterface $node] {
  // Check if ZipArchive class exists.
  if [!class_exists['ZipArchive']] {
    \Drupal::logger['MY_MODULE']->warning['Could not compress file, PHP is compiled without zip support.'];
  }

  // Prepare destination directory.
  $directory = 'public://node-zip-files/' . $node->bundle[];
  $file_system = \Drupal::service['file_system'];
  $file_system->prepareDirectory[$directory, FileSystemInterface:: CREATE_DIRECTORY | FileSystemInterface::MODIFY_PERMISSIONS];

  // Open zip archive.
  $zip = new \ZipArchive[];
  $zip_filename = $file_system->realpath[$directory . '/' . $node->id[] . '.zip'];
  $result = $zip->open[$zip_filename, constant['ZipArchive::CREATE']];
  if [!$result] {
    \Drupal::logger['MY_MODULE']->warning['Zip archive could not be created. Error: ' . $result];
  }

  // Add file uploaded to the provided node to the zip acrhive.
  $file = $node->get['field_file']->entity;
  $filepath = $file_system->realpath[$file->getFileUri[]];
  $result = $zip->addFile[$filepath, basename[$file->getFileUri[]]];
  if [!$result] {
    \Drupal::logger['MY_MODULE']->warning['File could not be added to zip archive.'];
  }

  // Close zip archive.
  $result = $zip->close[];
  if [!$result] {
    \Drupal::logger['MY_MODULE']->warning['Zip archive could not be closed.'];
  }
}

Chức năng này có thể được sử dụng như thế này

$node = \Drupal::entityTypeManager[]->getStorage['node']->load[SOME_NODE_ID];
MY_MODULE_create_zip_file[$node];

Tệp zip sẽ được tạo trong thư mục sau. công khai. //nút-zip-tệp/NODE_BUNDLE/SOME_NODE_ID. nén

Cách thay đổi tuyến đường - Drupal 9

Ngày 5 tháng 12 năm 2022

drupal

Các thành phần

Đôi khi bạn phải thay đổi tuyến đường được xác định bởi mô-đun đóng góp hoặc lõi Drupal. Đừng hack mô-đun và thay đổi *. định tuyến. tệp yml . Đó là một ý tưởng rất tồi bởi vì lần sau khi bạn cập nhật mô-đun, những thay đổi đó sẽ biến mất.

Cách tốt nhất để thay đổi tuyến đường trong Drupal 9 là sử dụng người đăng ký Tuyến đường. Trong ví dụ sau, tôi phải thay đổi cơ chế xác thực được phép cho tuyến trình phát hành xác thực JWT

MY_MODULE. dịch vụ. yml

services:
  MY_MODULE.route_subscriber:
    class: Drupal\MY_MODULE\Routing\RouteSubscriber
    tags:
      - { name: event_subscriber }

src/Định tuyến/RouteSubscriber. php

Chủ Đề