Tại sao các tập tin định tuyến được lấp đầy với dấu gạch dưới?


24

Thỏa thuận với tất cả các tham số có và không có ký tự gạch dưới có tiền tố là gì?

Trường hợp nào Drupal quyết định xử lý các tham số này?

Là khái niệm này được giới thiệu từ Symfony, hay nó mới đối với Drupal?

Ví dụ ( node.routing.yml ):

node.overview_types:
  path: '/admin/structure/types'
  defaults:
    _controller: '\Drupal\Core\Entity\Controller\EntityListController::listing'
    entity_type: 'node_type'
    _title: 'Content types'
  requirements:
    _permission: 'administer content types'

2
Đó là một quy ước của Symfony . Có một bài viết hay ở đây , tìm bit nói Điều cuối cùng cần chú ý là ý nghĩa đặc biệt của ký tự gạch dưới trong tên tham số. Các thông số bắt đầu với nhân vật này có ý nghĩa đặc biệt
Clive

1
Cảm ơn Clive. Bài viết này đề cập đến "ý nghĩa đặc biệt", nhưng không giải thích điều này cả. Tại sao các tham số không gạch dưới cũng đặc biệt?
Daniel

1
lol, tại sao các thông số không gạch dưới cũng không đặc biệt? , nghe có vẻ như một câu hỏi mang tính tồn tại sâu sắc! Thông thường (chỉ thông thường) các biến tiền tố được thực hiện để chỉ ra var 'private' (không có khả năng ở đây) hoặc để tránh đặt tên xung đột với các lớp / phương thức / thứ khác trong hệ thống. Sẽ rất tốt để xem các tài liệu chính thức, vâng
Clive

Câu trả lời:


41

Ở đây có một lời giải thích tốt hy vọng đằng sau ý tưởng về hệ thống định tuyến cũng như các bổ sung cụ thể của drupal cho nó.

Tổng quan chung

Các thành phần Symfony có hai khái niệm quan trọng ở đây. Hạt nhân http là một hệ thống nhận được yêu cầu, bằng cách nào đó yêu cầu các hệ thống khác tạo ra để xác định đoạn mã tạo ra đầu ra được yêu cầu (một đối tượng phản hồi) và gửi phản hồi lại cho máy khách. Đoạn mã này được gọi là bộ điều khiển, vì vậy đây có thể là một hàm giống như php4 thuần túy, một phương thức trên một đối tượng hoặc thậm chí là một hàm ẩn danh.

Hệ thống biết bộ điều khiển nào chịu trách nhiệm cho yêu cầu hiện tại là hệ thống định tuyến.

nhập mô tả hình ảnh ở đây

Tập tin định tuyến cơ bản

Là nhà phát triển mô-đun, bạn xác định danh sách các tuyến và bộ điều khiển tương ứng.

Dưới đây là một ví dụ cho phản hồi json:

taxonomy.autocomplete_vid:
  path: '/taxonomy/autocomplete_vid/{taxonomy_vocabulary}'
  defaults:
    _controller: '\Drupal\taxonomy\Controller\TermAutocompleteController::autocompletePerVid'
  requirements:
    taxonomy_vocabulary: \d+

Hầu hết các tài liệu symfony đều đề cập đến mẫu, nhưng drupal quyết định chỉ cho phép khóa "đường dẫn" không được dùng trong tệp định tuyến của nó.

Khái niệm chính là bộ điều khiển nhận một số tham số từ hệ thống và chuyển đổi chúng thành phản hồi. Trong ví dụ này, bạn có tham số 'taxonomy_vocellect'. Vì vậy, mọi thứ không có dấu gạch dưới được coi là một tham số cho bộ điều khiển. Nếu bạn muốn chỉ định một giá trị mặc định, bạn đặt nó vào mảng mặc định. Trong cùng một mảng yml, bạn chỉ định lớp và phương thức được kết nối với '::' để báo cho hệ thống biết nơi cần tìm công cụ. Mọi thuộc tính khác không liên quan gì đến các tham số của bộ điều khiển và do đó được coi là nội bộ và do đó có dấu gạch dưới làm tiền tố.

Bản thân Symfony cũng cho phép bạn xác định các biểu thức chính quy để xác thực rằng tham số đến là hợp lệ (sử dụng 'yêu cầu'). Ở đây nó sẽ chỉ khớp với số.

Bộ điều khiển bộ giải

Khi symfony tìm ra bộ điều khiển nào đang hoạt động theo yêu cầu hiện tại, nó sẽ yêu cầu trình phân giải bộ điều khiển được gọi là tạo một thể hiện của bộ điều khiển, có thể được thực thi thông qua call_user_func_array. Bộ giải quyết bộ điều khiển có một phương thức để có được bộ điều khiển có thể gọi được (đối tượng + phương thức, hàm ẩn danh) và một phương thức để nhận các tham số được truyền cho bộ điều khiển, xem Trình phân giải bộ điều khiển

Tiện ích mở rộng

Đây là cơ bản những gì symfony mang lại cho bạn.

Drupal mặc dù phức tạp hơn một chút:

  • Bạn có thể kiểm tra quyền truy cập vào tuyến đường. Ví dụ, gọi user_access () rất phổ biến trong Drupal 7 trở xuống.
  • Bạn không muốn chuyển đổi từ phân loại thành đối tượng thực thể của nó
  • Bạn không muốn tạo phản hồi toàn trang mà chỉ là "nội dung chính".

Kiểm tra truy cập

Drupal đã giới thiệu một hệ thống trên đầu các bộ phận symfony để kiểm tra xem người dùng có quyền truy cập vào tuyến đường hiện tại hay không và ném ngoại lệ 403 (truy cập bị từ chối). Quản lý truy cập

Trong tệp định tuyến, bạn chỉ định điều này trong phần yêu cầu. Các bit phổ biến nhất được liệt kê trong ví dụ:

  path: '/user/{user}'
  options:
    _access_mode: 'ANY'
  requirements:
    _permission: 'access user profiles'
    _entity_access: 'user.view'
    _role: 'administrator'

_ allow xác định cuộc gọi đến user_access (), _role đảm bảo rằng người dùng có một vai trò nhất định (bạn có thể chỉ định nhiều cuộc gọi thông qua, cho OR và + cho logic AND). _entity_access hỏi hệ thống thực thể xem bạn có quyền truy cập để xem thực thể người dùng hay không. Mỗi drupal mặc định đảm bảo rằng bạn thêm trình kiểm tra truy cập cho phép bạn tiếp tục, nhưng bạn có thể chuyển đổi nó trong các tùy chọn thông qua _access_mode.

U ám

Như đã đề cập trong danh sách bạn không muốn quan tâm đến việc tải một thực thể, hãy xem / user / {user} làm ví dụ. Đối với các thực thể, về cơ bản bạn chỉ cần sử dụng tên của loại thực thể và nó sẽ thực thi một thực thể_load với ID được truyền trong URL. Trình quản lý chuyển đổi Param

Phản hồi của trang

Như được viết trước khi bộ điều khiển chịu trách nhiệm tạo đối tượng phản hồi. Điều này thật kinh khủng ở Drupal vì một trang bao gồm rất nhiều giống như tất cả các khối xuất hiện trong các vùng của nó, các mẫu html và trang, v.v. Do đó, drupal đã chỉ định một khóa khác để chỉ định một bộ điều khiển trả về nội dung của trang:

user.page:
  path: '/user'
  defaults:
    _content: '\Drupal\user\Controller\UserController::userPage'
  requirements:
    _access: 'TRUE'

Chuỗi được xác định là bộ điều khiển được sử dụng để tạo mảng kết xuất cho vùng nội dung chính của trang của bạn.

Một sự bổ sung khác cũng là cách xử lý các biểu mẫu, vì việc trả về một trang với một biểu mẫu phức tạp hơn một chút so với chỉ một mảng kết xuất, vì vậy bạn có thể xác định _form với FormInterface chịu trách nhiệm cho biểu mẫu hiện tại.

user.pass:
  path: '/user/password'
  defaults:
    _form: '\Drupal\user\Form\UserPasswordForm'
  requirements:
    _access: 'TRUE'

Lưu ý: Điều này bao gồm những điểm quan trọng nhất theo quan điểm của tôi, mặc dù chắc chắn có nhiều điểm để nói hơn.

TL; DR

  • Dấu gạch dưới được chỉ định cho mọi thứ không phải là tham số cho bộ điều khiển. Đây là một loại "tiêu chuẩn" từ symfony.
  • Các tham số này được phát sóng thông qua bộ chuyển đổi param và được chuyển đến bộ điều khiển bằng bộ giải quyết bộ điều khiển
  • Drupal có một số bổ sung để giúp mọi người tương tác dễ dàng hơn với hệ thống định tuyến symfony.

Ồ Câu trả lời ấn tượng. Tại sao các tham số nhất định có dấu chấm trong chúng trái ngược với việc sử dụng dấu gạch dưới? Ví dụ user.pass(trong ví dụ trên) vs user_pass. Đó có phải là một quy ước symfony không?
chrisjlee

2
Có một số loại quy ước để sử dụng $ module. $ Name làm tên máy của tuyến đường. Không có gì mặc dù giả định rằng trong nội bộ.
Daniel Wehner

Theo vấn đề dưới đây, _content hoàn toàn không được sử dụng nữa, nhưng _controll là. Vì vậy, ví dụ trong phần Phản hồi Trang không cập nhật. drupal.org/node/2378809 Nếu chúng tôi muốn hiển thị dữ liệu trong vùng nội dung của trang của mình, thì bộ điều khiển sẽ xác định một mảng kết xuất, tương tự như cách thực hiện trong Drupal 7. Nếu chúng tôi muốn bỏ qua điều đó và tạo trang của chúng tôi từ đầu, sau đó chúng ta có thể trả về một đối tượng Phản hồi.
benelori

Chắc chắn rồi, bạn không thể ngờ rằng 1,5 năm không xảy ra
Daniel Wehner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.