Lebih baik menyalakan kait spesifik atau kait generik dengan parameter?

8

Saya membuat plugin formulir untuk menangani formulir yang dapat dikaitkan dengan menggunakan tindakan / filter oleh pengembang.

Plug-in saya harus dapat menangani berbagai bentuk dengan set filter yang berbeda dan saya melihat 2 cara melakukan ini.

Metode 1

Api kait khusus untuk setiap bentuk.

Jadi kode seperti ini bisa disebut form di dalam plugin saya:

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

Dan bisa digunakan seperti:

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

    return $errors;
} 10, 2)

Metode 2

Lewati parameter ke fungsi panggilan.

Jadi kode seperti ini bisa disebut form di dalam plugin saya:

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

Dan bisa digunakan seperti:

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)

Apakah ada contoh di inti WordPress di mana masalah semacam ini ditangani?

Apakah ada metode yang disukai untuk menangani ini?

veganista
sumber

Jawaban:

2

Metode 1 jauh lebih kuat dan dapat diperpanjang, menurut saya.

Metode 1: Untuk menambah atau menghapus formulir, atau fungsi lainnya, Anda cukup menambahkan atau menghapus fungsi. Secara khusus, Anda dapat melakukan ini dari file lain, seperti modul terpisah dari plugin Anda atau plugin eksternal lainnya. Saya pikir ini adalah argumen utama yang mendukungnya: ekstensibilitas dan modularitas.

Metode 2: Untuk menambah atau menghapus formulir atau fungsi lain Anda perlu memodifikasi fungsi yang ada, yang jauh lebih rentan terhadap bug. Pernyataan peralihan seperti yang ada di metode 2 dengan mudah lepas kendali. Daftar kasing bisa sangat panjang, dan mudah untuk memperkenalkan bug segera setelah Anda memiliki beberapa filter dengan jenis pernyataan pergantian yang sama. Misalnya, Anda mungkin ingin filter untuk validasi, tampilan formulir kosong yang akan diisi, tampilan konten formulir yang diisi, manajemen basis data, ... Jadi sekarang Anda memiliki banyak fungsi masing-masing dengan daftar kasus sakelar yang sangat panjang. , bahwa Anda harus tetap sinkron.

(Saya punya pengalaman buruk tentang ini dengan ekstensi populer untuk bentuk gravitasi - itu tidak bisa dikelola jika Anda disiplin, misalnya menyimpan daftar kasus dalam urutan yang sama di semua fungsi, tetapi juga tidak cantik.)

Menemukan bug: Lebih mudah dengan Metode 1: pelakunya biasanya adalah filter atau formulir yang baru ditambahkan, daripada beberapa kesalahan ketik yang secara tidak sengaja diperkenalkan dalam fungsi Metode 2 yang sangat lama.

Contoh: Anda akan menemukan banyak contoh Metode 1 di inti wordpress (mis. Https://developer.wordpress.org/?s=post+type&post_type[[=wp-parser-hook ), tapi saya tidak ingat contoh tunggal Metode 2.

adelval
sumber
4

Buat nama hook spesifik untuk apa fungsinya, bukan di mana namanya. Jangan melewati beberapa parameter, karena itu tidak mudah diperluas. Lewatkan objek parameter sebagai gantinya.

Contoh

Buat objek parameter dengan antarmuka untuk injeksi ketergantungan:

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

Sekarang berikan di filter Anda:

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

Pengembang pihak ketiga dapat membacanya sekarang, tetapi tidak mengubahnya, sehingga yang lain dapat mengandalkan strukturnya, karena tidak ada cara untuk merusaknya.

add_filter( 'form_is_valid', function( $bool, Validation_Parameters $params ) {
    // do something and return a value
});
fuxia
sumber
Meskipun saya suka ide Anda melewati objek untuk paramaters filter, saya tidak yakin itu menjawab pertanyaan awal saya. Juga, apa yang Anda maksud dengan: "Buat nama kait spesifik untuk apa yang dilakukannya, bukan di tempat namanya" Dalam contoh di atas 'form_validate' harus dihubungkan ke untuk memvalidasi formulir berdasarkan $ data yang dikirimkan, saya telah memodifikasi pertanyaan untuk membuatnya lebih jelas
veganista