問題描述
我正在創建一個表單插件來處理可以通過開發人員使用動作/過濾器掛鈎的表單。
我的 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。