Các loại móc khác nhau là gì?


7

Trong một bài đăng trên blog cũ , Larry Garfield đề cập đến các hook "kiểu đăng ký" và các hook hook hook_nodeapi.

Khi nói đến việc phá vỡ các loại móc khác nhau, dường như không có bất kỳ tài liệu nào. Có một danh sách lớn các hook và Tim Plunkett đã tìm thấy hai nhóm khử liên quan đến hook, nhưng dường như không có sự phân tích chính thức nào về các loại hook khác nhau mà chúng ta có.

Một sự cố như vậy sẽ như thế nào?


Câu hỏi thú vị. Bạn có sau một cuộc thảo luận lý thuyết hoặc có một vấn đề cụ thể bạn đang cố gắng giải quyết?
marcvangend

2
Tôi đang hỏi một vài lý do. 1) giúp viết luận án của tôi 2) sẽ tốt cho tài liệu vì các loại móc khác nhau gây nhầm lẫn cho người mới 3) Sẽ tốt khi biết khi thiết kế mô-đun và để phát triển cốt lõi, giúp cách ly các thực tiễn tốt nhất và nơi thực hành tốt nhất không có trong địa điểm
linclark

Câu trả lời:


7

Tôi sẽ nhóm chúng thành ba, bốn nhóm, nhưng không có sự khác biệt về kỹ thuật / nội bộ giữa chúng. Tất cả chỉ là các chức năng được gọi vì quy ước đặt tên.

  1. Móc thông tin. Các hook cung cấp thông tin về một cái gì đó, ví dụ điển hình là hook_entity_info () , hook_field_info () , hook_hook_info () nhưng cũng hook_ allow () , hook_menu () , hook_theme () , v.v ... Nhiều trong số này có _infohậu tố nhưng không nhất thiết phải có . Các hook này có thể được gọi bất cứ lúc nào và thông tin trả về thường được lưu vào bộ đệm (bộ đệm tĩnh hoặc bộ đệm liên tục) hoặc được lưu trữ vào các bảng cụ thể (ví dụ hook_menu()).

  2. Phản ứng / hành động móc. Tôi chỉ phát minh ra cái tên đó, nhưng đây là những móc được gọi khi một cái gì đó cụ thể happenend như hook_init () , hook_node_save(), hook_user_save(), hook_node_view () và vân vân.

  3. Thay đổi móc. Các hook có thể được sử dụng để thay đổi thứ gì đó được cung cấp bởi các mô-đun khác, tồn tại cho hầu hết mọi hook thông tin (ví dụ hook_menu_alter () hoặc hook_entity_info_alter () ) và một số hook hành động (ví dụ hook_node_view_alter () ).

Ngoài ra còn có một nhóm thứ tư nhưng những người thực sự không thực sự móc và họ là một trong những lý do chính cho sự nhầm lẫn điển hình về móc. Chúng thường được gọi là "Gọi lại". Đây là "Móc" chỉ được gọi cho một mô-đun duy nhất, sở hữu một cái gì đó. Các ví dụ điển hình bao gồm các cuộc gọi lại kiểu nút (hook_submit, hook_view, hook_form, ...), nhiều hook trường (ví dụ hook_field_load () ) nhưng cũng hook_block_view () . Có kế hoạch để loại bỏ những thứ này và thay thế bằng một cái gì đó khác (dựa trên oop) hoặc đổi tên chúng thành một cái gì đó khác hơn là hook.

Tôi cho rằng cũng có một số móc không thể được đặt chính xác vào bất kỳ nhóm nào trong số này hoặc là một hỗn hợp của các nhóm đó. Nếu vậy, đó có thể là một dấu hiệu cho thấy chúng nên được thiết kế lại. Nếu ai đó biết bất kỳ ví dụ nào, tôi có thể thêm nó ở đây.

Tuyên bố từ chối trách nhiệm: Đây không phải là chính thức nhưng làm thế nào tôi nhìn thấy nó. Sử dụng cẩn thận. ;)


0

Đọc bài đăng trên blog của Larry, tôi không nghĩ anh ta có ý nói rằng chỉ có hai loại móc (kiểu đăng ký và kiểu gật đầu). Theo tôi biết, không có loại móc chính thức nào được xác định. Về cơ bản, tất cả các móc đều giống nhau về mặt kỹ thuật, nhưng có một sự khác biệt trong những gì chúng làm và khi chúng làm điều đó.

Móc có thể được gọi bất cứ nơi nào giữa yêu cầu http ban đầu và trả lại đầu ra. Hầu hết các hook có nghĩa là ảnh hưởng đến (thường là html) xuất ra cách này hay cách khác (gọi chúng là 'hook thông thường' nếu bạn muốn), ví dụ như hook_init .

Một số hook không có nghĩa là ảnh hưởng trực tiếp đến đầu ra, nhưng chúng thêm hoặc thay đổi sổ đăng ký đang được lưu trữ trong cơ sở dữ liệu. Đây là những gì mà Larry gọi là kiểu móc đăng ký. Chúng không được gọi thường xuyên, nhưng xây dựng một danh sách các giá trị liên tục có thể được sử dụng nhiều lần. Lưu trữ nó trong cơ sở dữ liệu như một sổ đăng ký cải thiện hiệu suất. Đây là những gì hook_menuhook_theme làm, trong số những người khác.

Kiểu 'gật gù' được đề cập trong blog đề cập đến các hook kết hợp một loạt các chương trình con trong một triển khai hook đơn. Trong D6, việc triển khai hook_nodeapi có thể đáp ứng với nhiều sự kiện, như lưu một nút, xem một nút và xóa một nút. Loại móc này không còn tồn tại trong D7 ; ví dụ, hook_nodeapi đã được thay thế bằng hook_node_insert, hook_node_view, hook_node_delete và một loạt các hook tương tự.


Tôi không có ý đề nghị rằng chỉ có hai loại móc. Tôi đang tìm kiếm một phân loại về những gì móc khác nhau làm. Ví dụ, có một số móc gọi lại (có lẽ hoàn toàn không nên móc, vì Berdir chỉ ra với nhóm thứ tư của anh ta ở trên) chỉ hoạt động trên loại nút được xác định trong mô-đun.
linclark

OK, tôi không chắc nếu bạn có ý đề nghị đó. Dù sao, tôi nghĩ rằng câu trả lời của tôi phù hợp với danh mục 3 + 1 của Berdir, tôi ủng hộ câu trả lời của anh ấy.
marcvangend

0

Một cách để phân chia chúng là về đầu vào và đầu ra: 1) chỉ đầu vào, 2) chỉ đầu ra, 3) đầu vào-đầu ra và 4) không đầu vào, không đầu ra.

Không có nhiều số 1, vì gần như bất cứ điều gì xảy ra đều có thể có một số phản ứng. Các ví dụ duy nhất tôi có thể nghĩ đến là xóa hook, ví dụ hook_file_delete (), hook_comment_delete (), trong đó hook lấy đối tượng bị xóa, nhưng đối tượng đó đã bị xóa, vì vậy không có lý do gì để phản hồi.

Các hook "kiểu đăng ký" sẽ là # 2, chỉ xuất ra. Họ chỉ cung cấp dữ liệu vào một sổ đăng ký trung tâm và không nhận bất kỳ đầu vào nào. hook_menu () và hook_help () là những ví dụ.

hook_nodeapi () là # 3, nhưng bây giờ nó được chia thành các hàm khác nhau như hook_node_presave () - vẫn là # 3 - và hook_node_delete () - hiện là # 1. Đây là nhóm phổ biến nhất. Nhiều ví dụ rõ ràng có từ "thay đổi" trong tên hook, ví dụ hook_form_alter ().

Một cái gì đó như hook_init () sẽ là # 4. Ngoài thông báo chung về một sự kiện, không có đầu vào cũng như đầu ra.

Đó là một sự cố khá tùy tiện. Bạn có thể dễ dàng tranh luận về việc chia số 3 thành các hook trong đó đầu ra có cấu trúc giống như đầu vào (thay đổi) so với các hook trong đó đầu ra có cấu trúc hoàn toàn khác (phản hồi cuộc gọi). Hoặc bạn có thể kết hợp # 1 và # 4, vì chính hàm gọi là một kiểu đầu vào, vì vậy sự khác biệt chỉ là ở mức độ chi tiết.


hook_menu_alter cũng chỉ là đăng ký, nhưng nó "lấy đầu vào".
tim.plunkett
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.