Tốt hơn để bắn móc cụ thể hoặc móc chung với thông số?


8

Tôi đang tạo một plugin biểu mẫu để xử lý các biểu mẫu có thể được các nhà phát triển kết nối bằng cách sử dụng các hành động / bộ lọc.

Trình cắm của tôi cần có khả năng xử lý các biểu mẫu khác nhau với các bộ lọc khác nhau và tôi thấy có 2 cách để thực hiện việc này.

Phương pháp 1

Lửa móc cụ thể cho từng hình thức.

Vì vậy, mã như thế này có thể được gọi là hình thức trong plugin của tôi:

$formId = 'contact';
$errors = apply_filters('forms_validate_' . $formId, $errors, $data);

Và có thể được sử dụng như vậy:

add_filter('forms_validate_contact', function($errors, $data){
    if(empty($data['name'])){
        $errors['name'] = 'Name is required';
    }

    return $errors;
} 10, 2)

Cách 2

Truyền tham số cho hàm gọi.

Vì vậy, mã như thế này có thể được gọi là hình thức trong plugin của tôi:

$formId = 'contact';
$errors = apply_filters('forms_validate', $formId, $errors, $data);

Và có thể được sử dụng như vậy:

add_filter('forms_validate', function($formId, $error, $data){
    switch($formId){
        case 'contact':
            if(empty($data['name'])){
                $errors['name'] = 'Name is required';
            }
        break;
    }

    return $errors;
}, 10, 3)

Có bất kỳ ví dụ nào trong lõi WordPress nơi loại vấn đề này được giải quyết không?

Có một phương pháp ưa thích để đối phó với điều này?

Câu trả lời:


2

Theo tôi, Phương pháp 1 mạnh hơn và có thể mở rộng hơn nhiều.

Phương pháp 1: Để thêm hoặc xóa biểu mẫu hoặc chức năng khác, bạn chỉ cần thêm hoặc xóa chức năng. Cụ thể, bạn có thể thực hiện việc này từ các tệp khác, chẳng hạn như các mô-đun riêng biệt của plugin hoặc các plugin bên ngoài khác. Tôi nghĩ rằng đây là đối số chính trong lợi ích của nó: tính mở rộng và tính mô đun.

Phương pháp 2: Để thêm hoặc xóa biểu mẫu hoặc chức năng khác, bạn cần sửa đổi một chức năng hiện có, dễ bị lỗi hơn nhiều. Một câu lệnh chuyển đổi giống như trong phương thức 2 dễ dàng vượt khỏi tầm tay. Danh sách các trường hợp có thể rất dài và rất dễ để đưa ra các lỗi ngay khi bạn có một vài bộ lọc với cùng một loại câu lệnh chuyển đổi. Ví dụ: bạn có thể muốn các bộ lọc để xác thực, hiển thị các biểu mẫu trống được điền, hiển thị nội dung của các biểu mẫu đã điền, quản lý cơ sở dữ liệu, ... Vì vậy, bây giờ bạn có một loạt các chức năng với một danh sách rất dài các trường hợp chuyển đổi , mà bạn phải giữ đồng bộ.

(Tôi đã có một số kinh nghiệm tồi tệ về điều này với một phần mở rộng phổ biến cho các dạng trọng lực - không thể quản lý được nếu bạn bị kỷ luật, ví dụ: giữ danh sách các trường hợp theo cùng một thứ tự trong tất cả các chức năng, nhưng nó cũng không đẹp.)

Xác định vị trí lỗi: Dễ dàng hơn nhiều với Phương pháp 1: thủ phạm thường sẽ là bộ lọc hoặc biểu mẫu mới được thêm vào, thay vì một số lỗi đánh máy vô tình được giới thiệu trong chức năng rất dài của Phương pháp 2.

Ví dụ: Bạn sẽ tìm thấy vô số ví dụ về Phương pháp 1 trong lõi wordpress (ví dụ: https://developer.wordpress.org/?s=post+type&post_type[[=wp-parser-hook ), nhưng tôi không nhớ một ví dụ duy nhất của Phương pháp 2.


4

Đặt tên hook cụ thể cho những gì nó làm, không phải nơi nó được gọi. Không vượt qua nhiều tham số, vì điều đó không dễ dàng để mở rộng. Truyền một đối tượng tham số thay thế.

Thí dụ

Tạo đối tượng tham số với giao diện để tiêm phụ thuộc:

interface Validation_Parameters {

    public function id();

    public function errors();

    // not a good name …
    public function details();
}

class Form_Validation_Parameters implements Validation_Parameters {

    private $id;

    private $errors;

    private $details;

    public function __construct( $id, $errors, $details ) {

        $this->id      = $id;
        $this->errors  = $errors;
        $this->details = $details;
    }

    public function id() {
        return $this->id;
    }

    public function errors() {
        return $this->errors;
    }

    public function details() {
        return $this->details;
    }
}

$params = new Form_Validation_Parameters( 
    'contact',
    new WP_Error(), // should be prepared better.
    [ 'request' => $_SERVER['REQUEST_URI'] ]
);

Bây giờ vượt qua nó trong bộ lọc của bạn:

$valid = apply_filters( 'form_is_valid', TRUE, $params );

Một nhà phát triển bên thứ ba có thể đọc nó ngay bây giờ, nhưng không thay đổi nó, vì vậy những người khác có thể dựa vào cấu trúc của nó, bởi vì không có cách nào để làm hỏng nó.

add_filter( 'form_is_valid', function( $bool, Validation_Parameters $params ) {
    // do something and return a value
});

Mặc dù tôi thích ý tưởng của bạn về việc chuyển qua một đối tượng cho các tham số bộ lọc, tôi không chắc nó trả lời câu hỏi ban đầu của tôi. Ngoài ra, ý của bạn là gì: "Đặt tên hook cụ thể cho những gì nó làm, không phải ở nơi nó được gọi" Trong ví dụ ở trên 'Forms_validate' nên được nối vào để xác thực biểu mẫu dựa trên dữ liệu $ được truyền, tôi đã sửa đổi câu hỏi để làm cho điều này rõ ràng hơn một chút
veganista
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.