Điểm:2

Định tuyến có thể sử dụng các tham số đã có trong URL không?

lá cờ cn

Tôi thực sự đang sử dụng D9 để xây dựng một hệ thống với các thực thể sử dụng các thực thể phụ. Hệ thống thực thể chính sử dụng đường dẫn sau: /item/{item} Mỗi thực thể phụ có liên quan đến một thực thể chính và sử dụng đường dẫn sau: /item/{item}/sub_item/{sub_item}

Vì vậy, để truy cập biểu mẫu chỉnh sửa hoặc xóa, cần có các đường dẫn sau:

/item/{item}/sub_item/{sub_item}/chỉnh sửa /item/{item}/sub_item/{sub_item}/xóa

Ví dụ: /item/1/sub_item/4/edit

Tôi đã khai báo lộ trình sau:

thực thể.sub_item.edit_form:
  đường dẫn: '/item/{item}/sub_item/{sub_item}/edit'
  mặc định:
    _entity_form: 'sub_item.edit'
    _title: 'Chỉnh sửa mục con'
  tùy chọn:
    _admin_route: ĐÚNG
    thông số:
      mục:
        loại: thực thể:mục
        with_config_overrides: ĐÚNG
      mục con:
        loại: thực thể:sub_item
        with_config_overrides: ĐÚNG
  yêu cầu:
    _permission: 'quản lý cấu hình trang web'

Các liên kết Chỉnh sửa và Xóa được tạo bởi trình tạo danh sách từ getOperations. Trình tạo danh sách nằm trên tuyến đường sau: /item/1/sub_items (đây là "bộ sưu tập" để hiển thị các mục phụ được đính kèm với mục chính).

Tôi đã hy vọng rằng URL hiện tại chứa item/{item} có thể được trình tạo liên kết sử dụng lại trực tiếp, nhưng thực tế không phải vậy...

Symfony\Component\Routing\Exception\MissingMandatoryParametersException : Thiếu một số tham số bắt buộc ("mục") để tạo URL cho tuyến đường "entity.sub_item.edit_form".trong Drupal\Core\Routing\UrlGenerator->doGenerate() (dòng 181 của /core/lib/Drupal/Core/Routing/UrlGenerator.php).

Tôi đã cố gắng tạo một lớp htmlRouteProvider cụ thể cho lớp thực thể mục phụ của mình nhưng trong trường hợp này, các tuyến đường được tạo khi bộ nhớ cache bị xóa và tôi không có quyền truy cập vào mục trong URL để đặt nó...

Vì vậy, ... Câu hỏi của tôi là: Tôi đang thiếu thứ gì đó để thực hiện dễ dàng hoặc tôi phải triển khai lại phương thức "toUrl()" của lớp thực thể mục con của mình để bao gồm tham số "mục" mới "một cách nhanh chóng "?

Cảm ơn trước cho bất kỳ đề nghị.

Tái bút: đó là giải pháp tôi thực sự có trong lớp thực thể mục phụ của mình:

  public function toUrl($rel = 'canonical', array $options = []) {
    $uri = cha mẹ::toUrl($rel, $options);
    $uri->setRouteParameter('item', \Drupal::routeMatch()->getRawParameter('item'));
    trả lại $uri;
  }

Nhưng có lẽ một giải pháp tốt hơn có thể được tìm thấy?

Jaypan avatar
lá cờ de
Bạn không hiển thị mã bạn đang sử dụng để tạo URL gây ra lỗi.
Jaypan avatar
lá cờ de
Tôi nên thêm, có lẽ tôi không muốn gây rối với đường dẫn đến phần tử phụ mà thay vào đó hãy tạo bí danh cho phần tử đó cho đường dẫn bạn muốn.
lá cờ cn
Không có mã, đây là EntityListBuilder::getDefaultOperations tự động tạo các liên kết hiển thị trong cột "hoạt động" của danh sách. Vì vậy, tôi có thể ghi đè nó hoặc ghi đè phương thức con như Entity::toUrl hoặc Entity::urlRouteParameters như được đề xuất bởi @ 4k4. Tôi đã tự hỏi liệu có một "cách kỳ diệu" nào khác không, như khai báo phần tử cụ thể vào tệp định tuyến.yml, tức là: tùy chọn: thông số: mục: loại: thực thể:{item} #
Điểm:2
lá cờ cn

I would override SubItem::urlRouteParameters() and make this independent from the current route match so that the entity can build links on all pages:

  protected function urlRouteParameters($rel) {
    $parameters = parent::urlRouteParameters($rel);
    // assuming the parent relationship is a reference field
    $parameters['item'] = $this->parent->target_id;
    // if the reference field is in the parent you have to run an entity query
    return $parameters;
  }
lá cờ cn
Vâng. entity->toUrl() gọi thực thể->urlRouteParameters() để truy xuất các tham số của tuyến đường. Nó chỉ là một cấp độ cao hơn. Nhưng nếu không có cách nào khác, tôi có thể ghi đè lên một trong hai phương thức này. Cảm ơn đề nghị của bạn.
4uk4 avatar
lá cờ cn
IMHO phương pháp được bảo vệ này chỉ tồn tại để bị ghi đè trong các trường hợp sử dụng như vậy.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.