Zend Framework 3, фабрика фильтров передается контейнеру, у которого нет доступа к настроенным службам.

Как раз в процессе перехода с ZF2 на ZF3 пытался добавить HTMLPurifier в качестве фильтра.

В этой статье описывается, как добавлять фильтры в FilterPluginManager https://zendframework.github.io/zend-filter/writing-filters/

Я думал, что сделал все необходимое: https://github.com/Saeven/Purifier/blob/master/src/Soflomo/Purifier/Module.php

При попытке использовать фильтр фабрика вызывается, как и ожидалось: https://github.com/Saeven/Purifier/blob/master/src/Soflomo/Purifier/Factory/Filter/PurifierFilterFactory.php#L14

Но фабрика умирает, когда пытается ->get('HTMLPurifierEngine') с этой ошибкой:

Uncaught Zend\ServiceManager\Exception\ServiceNotFoundException: невозможно преобразовать службу HTMLPurifierEngine в фабрику; Вы уверены, что предоставили его во время настройки? в /Users/Saeven/Documents/Circlical/code/Cloudshare/vendor/zendframework/zend-servicemanager/src/ServiceManager.php:675

Самое смешное, что этот сервис точно определен, здесь: https://github.com/Saeven/Purifier/blob/master/config/module.config.php#L20

Должно быть, я упускаю что-то очевидное. Может быть, слишком долго смотрел на него...

Вы знаете, как настроить модуль, чтобы избежать этой ошибки? Почему служба не видна контейнеру?

Спасибо!


person Saeven    schedule 09.10.2016    source источник
comment
Пожалуйста, поместите основную часть ваших кодов здесь, это легче читать. Более того, внешние ссылки могут быть неработающими...   -  person Al Foиce ѫ    schedule 10.10.2016
comment
Я нашел решение, это была непонятная комбинация изменений SM, которая теперь имеет смысл. Решение выложу позже.   -  person Saeven    schedule 10.10.2016
comment
Пожалуйста, опубликуйте решение как ответ, возможно, это поможет другим людям в будущем...   -  person Al Foиce ѫ    schedule 11.10.2016


Ответы (3)


У вас включено кэширование конфигурации? Это может вызвать такую ​​проблему.

person djozsef    schedule 09.10.2016

В конфигурационных файлах фильтры имеют свою запись input_filters, а не ключ service_manager:

'input_filters' => array(
    'factories' => [
        'HTMLPurifierEngine' => HtmlPurifierFactory::class,
    ],
),
person Al Foиce ѫ    schedule 10.10.2016
comment
Это было имя службы, которая нужна фильтру, а не сам фильтр. - person Saeven; 10.10.2016

В ZF3 произошли некоторые изменения в том, как и какие карты классов используются.

Очевидная вещь, которую мне всегда не хватало: вы создали карты классов?

Пытаться

$ php composer.phar dump-autoload -o

в корневом каталоге вашего приложения.

person David H.    schedule 10.10.2016