問題描述

我正在建立一個表單外掛來處理可以透過開發人員使用動作/過濾器掛鉤的表單。

我的 plug-in 需要能夠處理不同的形式與不同的過濾器集,我看到兩種方法。

方法 1

每個表格的特定鉤子的火。

所以這樣的程式碼可以在我的外掛中被呼叫:

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

可以像這樣使用:

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

    return $errors;
} 10, 2)

方法 2

將引數傳遞給呼叫函式。

所以這樣的程式碼可以在我的外掛中被呼叫:

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

可以像這樣使用:

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)

在 WordPress 核心中有哪些例子可以解決這類問題?

有沒有辦法處理這個?

最佳解決方案

使鉤子名稱具體到它的作用,而不是在哪裡被呼叫。不要傳遞多個引數,因為這不容易擴充套件。換一個引數物件。

例子

使用用於依賴注入的介面建立引數物件:

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'] ]
);

現在把它傳遞給你的過濾器:

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

一個 third-party 開發人員現在可以讀取它,但不能改變它,所以其他人可以依靠它的結構,因為沒有辦法破壞它。

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

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。