Melhor disparar ganchos específicos ou ganchos genéricos com parâmetros?

8

Estou criando um plug-in de formulário para lidar com formulários que podem ser conectados ao uso de ações / filtros pelos desenvolvedores.

Meu plug-in precisa ser capaz de lidar com diferentes formas com diferentes conjuntos de filtros e vejo duas maneiras de fazer isso.

Método 1

Fogo de ganchos específicos para cada formulário.

Então, um código como esse poderia ser chamado de formulário dentro do meu plugin:

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

E poderia ser usado assim:

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

    return $errors;
} 10, 2)

Método 2

Passe um parâmetro para a função de chamada.

Então, um código como esse poderia ser chamado de formulário dentro do meu plugin:

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

E poderia ser usado assim:

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)

Existem exemplos no núcleo do WordPress em que esse tipo de problema é tratado?

Existe um método preferido para lidar com isso?

veganista
fonte

Respostas:

2

O método 1 é muito mais robusto e extensível, na minha opinião.

Método 1: Para adicionar ou remover formulários ou outras funcionalidades, basta adicionar ou remover funções. Em particular, você pode fazer isso com outros arquivos, como módulos separados do seu plug-in ou outros plugins externos. Penso que este é o principal argumento a seu favor: extensibilidade e modularidade.

Método 2: para adicionar ou remover formulários ou outras funcionalidades, você precisa modificar uma função existente, que é muito mais suscetível a erros. Uma declaração de troca como a do método 2 fica facilmente fora de controle. A lista de casos pode ser muito longa e é fácil introduzir bugs assim que você tiver vários filtros com o mesmo tipo de instrução switch. Por exemplo, você pode querer que filtros para validação, exibição de formulários vazios sejam preenchidos, exibição do conteúdo de formulários preenchidos, gerenciamento de banco de dados, ... Portanto, agora você tem várias funções, cada uma com uma lista muito longa de casos de comutação , que você precisa manter em sincronia.

(Eu tive uma experiência ruim com uma extensão popular para formas de gravidade - não é incontrolável se você é disciplinado, por exemplo, mantenha a lista de casos na mesma ordem em todas as funções, mas também não é bonito.)

Localizando erros: muito mais fácil com o método 1: o culpado geralmente será o filtro ou formulário recém-adicionado, em vez de algum erro de digitação introduzido inadvertidamente nessa função muito longa do método 2.

Exemplos: você encontrará vários exemplos do método 1 no núcleo do wordpress (por exemplo, https://developer.wordpress.org/?s=post+type&post_type[$=wp-parser-hook ), mas não me lembro uma única instância do método 2.

adelval
fonte
4

Torne o nome do gancho específico para o que faz, não para onde é chamado. Não passe vários parâmetros, porque isso não é fácil de estender. Passe um objeto de parâmetro.

Exemplo

Crie o objeto de parâmetro com uma interface para injeção de dependência:

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

Agora passe-o no seu filtro:

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

Um desenvolvedor de terceiros pode lê-lo agora, mas não pode alterá-lo, para que os outros possam confiar em sua estrutura, porque não há como corrompê-lo.

add_filter( 'form_is_valid', function( $bool, Validation_Parameters $params ) {
    // do something and return a value
});
fuxia
fonte
Embora eu goste da sua idéia de passar por um objeto para os parâmetros de filtro, não tenho certeza se ele responde à minha pergunta inicial. Além disso, o que você quer dizer com: "Especifique o nome do gancho para o que ele faz, não para onde é chamado" No exemplo acima, o 'forms_validate' deve ser conectado para validar o formulário com base nos $ dados passados, I modificamos a questão para tornar isso um pouco mais claro #
244