web-dev-qa-db-fra.com

Mieux vaut utiliser des hameçons spécifiques ou génériques avec des paramètres?

Je crée un plugin de formulaire pour gérer les formulaires auxquels les développeurs peuvent accéder en utilisant des actions/filtres.

Mon plug-in doit pouvoir gérer différents formulaires avec différents ensembles de filtres et je vois deux façons de le faire.

Méthode 1

Feu de crochets spécifiques pour chaque formulaire.

Donc, un code comme celui-ci pourrait être appelé forme dans mon plugin:

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

Et pourrait être utilisé comme suit:

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

    return $errors;
} 10, 2)

Méthode 2

Passer un paramètre à la fonction appelante.

Donc, un code comme celui-ci pourrait être appelé forme dans mon plugin:

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

Et pourrait être utilisé comme suit:

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)

Existe-t-il des exemples dans le noyau WordPress où ce type de problème est abordé?

Existe-t-il une méthode privilégiée pour régler ce problème?

8
veganista

La méthode 1 est beaucoup plus robuste et extensible, à mon avis.

Méthode 1: Pour ajouter ou supprimer des formulaires ou d'autres fonctionnalités, vous devez simplement ajouter ou supprimer des fonctions. Vous pouvez notamment le faire à partir d'autres fichiers, tels que des modules séparés de votre plugin ou d'autres plugins externes. Je pense que c'est l'argument principal en sa faveur: extensibilité et modularité.

Méthode 2: Pour ajouter ou supprimer des formulaires ou d'autres fonctionnalités, vous devez modifier une fonction existante, qui est beaucoup plus sujette aux bogues. Une instruction switch telle que celle de la méthode 2 devient facilement incontrôlable. La liste des cas peut être très longue et il est facile d’introduire des bogues dès lors que plusieurs filtres ont le même type d’instruction switch. Par exemple, vous pouvez souhaiter que des filtres pour la validation, l'affichage des formulaires vides à remplir, l'affichage du contenu des formulaires remplis, la gestion de la base de données, ... Ainsi, vous avez maintenant un tas de fonctions, chacune avec une très longue liste de cas de commutation. , que vous devez rester synchronisé.

(J'avais une mauvaise expérience de cela avec une extension populaire pour les formes gravimétriques - ce n'est pas ingérable si vous êtes discipliné, par exemple, gardez la liste des cas dans le même ordre dans toutes les fonctions, mais ce n'est pas joli non plus.)

Localisation des bogues: Beaucoup plus facile avec la méthode 1: le coupable sera généralement le filtre ou la forme nouvellement ajouté, plutôt que des erreurs de frappe introduites par inadvertance dans cette fonction très longue de la méthode 2.

Exemples: Vous trouverez des tonnes d'exemples de la méthode 1 dans le noyau de wordpress (par exemple https://developer.wordpress.org/? s = post + type & post_type [] = wp-parser-hook ), mais je ne me souviens pas d'une seule instance de la méthode 2.

2
adelval

Définissez le nom du hook en fonction de ce qu'il fait et non de l'endroit où il est appelé. Ne transmettez pas plusieurs paramètres, car cela n’est pas facile à étendre. Passez un objet de paramètre à la place.

Exemple

Créez l'objet de paramètre avec une interface pour l'injection de dépendance:

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

Maintenant, passez le dans votre filtre:

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

Un développeur tiers peut le lire maintenant, mais pas le modifier, les autres peuvent donc compter sur sa structure, car il n’ya aucun moyen de le corrompre.

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