Implementando namespaces no modelo de plug-in

4

Para aproveitar o tempo e melhorar minhas práticas de codificação, estou começando a implementar namespaces em meus próprios plugins, já que existem algumas vantagens, como eliminar a ambigüidade .

Eu encontrei uma pergunta semelhante para me ajudar a configurar meu modelo de plug-in que funcionou para mim. No entanto, desde então, modifiquei ligeiramente. Esta é minha configuração:

Em wp-plugin-template/wp-plugin-template.php :

<?php
/**
 * Plugin Name: WP Plugin Template
 */
# If accessed directly, exit
if ( ! defined( 'ABSPATH' ) ) exit;
# Call the autoloader
require_once( 'autoloader.php' );

use PluginTemplate\admin\Plugin_Meta;
new Plugin_Meta;

Em wp-plugin-template/autoloader.php :

<?php
spl_autoload_register( 'autoload_function' );
function autoload_function( $classname ) {
    $class = str_replace( '\', DIRECTORY_SEPARATOR, str_replace( '_', '-', strtolower($classname) ) );
    # Create the actual file-path
    $path = WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $class . '.php';
    # Check if the file exists
    if ( file_exists( $path ) ) {
        # Require once on the file
        require_once $path;
    }
}

Em wp-plugin-template/admin/plugin-meta.php :

<?php
namespace PluginTemplate\admin;
class Plugin_Meta {
    public function __construct() {
        add_action( 'plugins_loaded', array($this, 'test' ) );
    }

    public function test() {
        echo 'It works!';
    }
}

Quando tento ativar o modelo de plug-in para teste, recebo o seguinte erro:

  

Erro fatal : classe PluginTemplate\admin\Plugin_Meta não encontrada em wp-content/plugins/wp-plugin-template/wp-plugin-template.php na linha 11

Neste caso, a linha 11 é:

new Plugin_Meta;

Acho que isso é devido a eu ter o namespace chamado PluginTemplate ? O que estou fazendo de errado? Apenas para reiterar, a pergunta anterior que mencionei funcionou para mim antes de começar a renomear meus arquivos e diretórios.

    
por Ethan Jinks O'Sullivan 02.10.2016 / 19:19

2 respostas

2

O problema está na configuração do seu Autoloader. Você precisa converter seu namespace Camelcase para traços para localizar arquivos de acordo com sua estrutura de pastas atual.

Eu adicionei a função de conversão e atualizei sua função de autoloader.

Em wp-plugin-template/autoloader.php :

<?php
spl_autoload_register( 'autoload_function' );
function autoload_function( $classname ) {
    $class = str_replace( '\', DIRECTORY_SEPARATOR, str_replace( '_', '-', strtolower(convert($classname)) ) );
    # Create the actual file-path
    $path = WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $class . '.php';
    # Check if the file exists
    if ( file_exists( $path ) ) {
        # Require once on the file
        require_once $path;
    }
}

function convert($class){
    $class = preg_replace('#([A-Z\d]+)([A-Z][a-z])#','_', $class);
    $class = preg_replace('#([a-z\d])([A-Z])#', '_', $class);
    return $class;
}

Além disso, você precisa atualizar seu namespace de nível superior para WpPluginTemplate em wp-plugin-template.php e admin/plugin-meta.php , já que você está usando o wp-plugin-template como o nome da sua pasta de plug-in.

ATUALIZAÇÃO:

Quando o autoloader tenta encontrar Plugin_Meta class, ele irá procurar em YOUR_PLUGIN_DIR / wp-plugin-template / admin / plugin-meta.php

Em wp-plugin-template.php

<?php
/**
 * Plugin Name: WP Plugin Template
 */
# If accessed directly, exit
if ( ! defined( 'ABSPATH' ) ) exit;
# Call the autoloader
require_once( 'autoloader.php' );

use WpPluginTemplate\admin\Plugin_Meta;
new Plugin_Meta;

Em wp-plugin-template/admin/plugin-meta.php

<?php
namespace WpPluginTemplate\admin;
class Plugin_Meta {
    public function __construct() {
        add_action( 'plugins_loaded', array($this, 'test' ) );
    }

    public function test() {
        echo 'It works!';
    }
}
    
por C Sabhar 02.10.2016 / 20:23
2

Apenas uma nota adicional sobre o seu carregador automático:

Se a entrada $classname for PluginTemplate\admin\Plugin_Meta , o $path será

/full/path/to/wp-content/plugins/plugintemplate/admin/plugin-meta.php

e este arquivo não existe e a definição da classe Plugin_Meta não está carregada.

Também é não recomendado para usar diretamente a constante WP_PLUGIN_DIR , existem alternativas, como plugin_dir_path( __FILE__ ) .

Existem autoloaders mais completos, por exemplo, o autoloader gerado no Composer .

    
por birgire 02.10.2016 / 21:14