Очиститель HTML и spl_autoload_register - PullRequest
0 голосов
/ 04 марта 2019

Папки моей страницы

system/ <-- offline files (classes, cronjobs, libraries ...)
online/ <-- contain all php scripts ( available online )

system/

classes <-- all my own classes inside.
... directories ...
libraries/htmlpurifier <- contain HTMLPurifier

Я хочу использовать spl_autoload_register ()

<?php

define("DOC_ROOT", dirname(__DIR__));

function hTMLPurifier($class) {
 require DOC_ROOT . '/system/libraries/htmlpurifier/library/' . strtolower(str_replace('\\', '/', $class)) . '.php';
 }

 function myAutoload($class) {
 require DOC_ROOT . '/' . strtolower(str_replace('\\', '/', $class)) . '.php';
 }

spl_autoload_register('hTMLPurifier');
spl_autoload_register('myAutoload');


$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$clean_html = $purifier->purify($dirty_html);
?>

Я получаю следующее сообщение.

 .../htmlpurifier_config.php): failed to open stream: No such file or directory in ...

Если вставить

  "require_once '/path/to/HTMLPurifier.auto.php';"

сверху

<?php

define("DOC_ROOT", dirname(__DIR__));
require_once '/path/to/HTMLPurifier.auto.php';

function myAutoload($class) {
  require DOC_ROOT . '/' . strtolower(str_replace('\\', '/', $class)) . '.php';
 }


 spl_autoload_register('myAutoload');


 $config = HTMLPurifier_Config::createDefault();
 $purifier = new HTMLPurifier($config);
 $clean_html = $purifier->purify($dirty_html);
 ?>

Все работает.

Я хочу загрузить все классы с помощью spl_autoload_register () только без вставки

"require_once '/path/to/HTMLPurifier.auto.php';" 

сверху.Как я могу это сделать ???

1 Ответ

0 голосов
/ 05 марта 2019

HTML Purifier не работает с пространствами имен PHP, поэтому замена \\ на / не даст вам результатов, которые вы ищете.Ваша логика автозагрузки пытается загрузить класс HTMLPurifier_Config из файла htmlpurifier_config.php - так что вам нужно примерно так:

function autoloadHtmlPurifier($class) {
    require DOC_ROOT . '/system/libraries/htmlpurifier/library/'
        . str_replace('_', '/', $class) . '.php';
}
spl_autoload_register('autoloadHtmlPurifier');

(обратите внимание, что эта функция не использует strtolower() изаменяет _ на /.)

Но, глядя на реализацию автозагрузки HTML Purifier :

public static function getPath($class)
{
    if (strncmp('HTMLPurifier', $class, 12) !== 0) {
        return false;
    }
    // Custom implementations
    if (strncmp('HTMLPurifier_Language_', $class, 22) === 0) {
        $code = str_replace('_', '-', substr($class, 22));
        $file = 'HTMLPurifier/Language/classes/' . $code . '.php';
    } else {
        $file = str_replace('_', '/', $class) . '.php';
    }
    if (!file_exists(HTMLPURIFIER_PREFIX . '/' . $file)) {
        return false;
    }
    return $file;
 }

... есть хороший шанс, что простоезамена по-прежнему не будет работать правильно из-за крайнего случая языкового класса.Но вы можете попробовать это:

function autoloadHtmlPurifier($class) {
    require DOC_ROOT . '/system/libraries/htmlpurifier/library/'
        . str_replace('_', '/', $class) . '.php';
}
spl_autoload_register('autoloadHtmlPurifier');
spl_autoload_register(array('HTMLPurifier_Bootstrap', 'autoload'));

, который использует ваш собственный автозагрузчик для загрузки класса HTMLPurifier_Bootstrap, так что вам не нужно включать его в require, но все же есть преимущество использованияканонический автозагрузчик для HTML Purifier.

Предостережение

При этом в любом случае недостатком является то, что если HTML Purifier когда-либо переключится на пространства имен, ваш автозагрузчик для него сломается.Я бы действительно предложил вам придерживаться подхода require_once(DOC_ROOT . '/system/libraries/htmlpurifier/library/HTMLPurifier.auto.php') или установить HTML Purifier, используя composer, который позаботится об автоматической загрузке этой библиотеки (и, возможно, других) для вас :

Для библиотек, в которых указана информация об автозагрузке, Composer создает файл vendor / autoload.php.Вы можете просто включить этот файл и начать использовать классы, предоставляемые этими библиотеками, без дополнительной работы:

require __DIR__ . '/vendor/autoload.php';
...