PHP - автозагрузка PSR-4 в пространстве имен плагинов WordPress - PullRequest
0 голосов
/ 03 октября 2018

Я знаю, что было задано много похожих вопросов, но я следовал каждому руководству, которое смог найти, и оно все еще не работает для меня.Я не знаю, связано ли это с тем, что он является плагином WordPress, но автозагрузчик не находит мои классы.

В моем плагине я сталкиваюсь с множеством коллизий имен классов.Я знаю, что могу добавить к каждому классу имя плагина, но я чувствую, что было бы легче / чище иметь весь проект в определенном пространстве имен.Я все еще немного новичок в PHP, поэтому, возможно, я думаю, что все это неправильно, но я думаю, что это должно работать.Я понимаю, что есть другие способы заставить это работать, но я хотел бы понять, почему это не работает.Спасибо за любой вклад или помощь, которую вы можете предложить!

Я получаю ошибку:

Fatal error: Class 'DistinguishedSites\Inc\Base\Activate' not found in /home/pluginte/public_html/wp-content/plugins/distinguished-sites/distinguished-sites-plugin.php on line 47

Упрощенная структура каталогов:

/distinguished-sites
  - distinguished-sites-plugin.php
  - composer.json
  - /vendor
      - *All vendor files*
  - /inc
      - /Base
          - Activate.php
  *etc...*

Файл Activate.php:

<?php
/**
 * @package DistinguishedSites
 */
namespace DistinguishedSites\Inc\Base;

class Activate
{

    public static function activate() {
        $db = new DatabaseApi();
        $filter = new PostFilter;

        $db->createTable(); 

        $results = $filter->filterPosts();

        flush_rewrite_rules();
    }
}

Я пытаюсь использовать класс Activate в моём файле Отличительные сайты-plugin.php:

<?php
/**
 * @package DistinguishedSites
 */

use \DistinguishedSites\Inc\Base\Activate;

defined( 'ABSPATH' ) or die( 'Hey, what are you doing here? You silly human!' );

// Require autoload file.
if ( file_exists( dirname( __FILE__ ) . '/vendor/autoload.php' ) ) {
    require_once dirname( __FILE__ ) . '/vendor/autoload.php';
}

define( 'PLUGIN_PATH', plugin_dir_path( __FILE__ ));
define( 'PLUGIN_URL', plugin_dir_url( __FILE__ ));
define( 'PLUGIN', plugin_basename( __FILE__ ));

// Runs on plugin activation.
function activate_distinguished_sites_plugin() {
    Activate::activate();
}
register_activation_hook( __FILE__, 'activate_distinguished_sites_plugin');

// Runs of plugin deactivation.
function deactivate_distinguished_sites_plugin() {
    //Deactivate::deactivate();
}
register_deactivation_hook( __FILE__, 'deactivate_distinguished_sites_plugin');


// Initialize core classes of the plugin. 
if ( class_exists( 'DistinguishedSites\Init' ) ) {
    Init::register_services();
}

composer.json файл:

{
    "name": "sno/distinguished-sites",
    "description": "Distinguished sites badge submission plugin.",
    "type": "project",
    "license": "GPL",
    "authors": [
        {
            "name": "noah",
            "email": "noah.seichter@snosites.com"
        }
    ],
    "minimum-stability": "dev",
    "require": {},
    "autoload": {
        "psr-4": {
            "DistinguishedSites\\": "."
        }
    }
}

autoload_psr4.php file:

<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'DistinguishedSites\\' => array($baseDir . '/'),
);

1 Ответ

0 голосов
/ 04 октября 2018
В автозагрузчике

PSR-4 учитывается регистр, поэтому вам следует либо использовать заглавную букву Inc/, либо использовать строчные буквы в своих пространствах имен.

Имя подкаталога ДОЛЖНО совпадать с регистром подпространства именимена.

https://www.php -fig.org / psr / psr-4 /

...