Ở đâ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.
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.