Silex 2.0 Невозможно передать приложение Application $ в UserServiceProvider

Я использовал SimpleUser (https://github.com/jasongrimes/silex-simpleuser) надстройка для Silex (изначально 1.3). Я в процессе обновления моего приложения до Silex 2.0. Интерфейс UserProviderInterface в SimpleUser реализует интерфейс ServiceProviderInterface и ControllerProviderInterface. Первый теперь определен в Pimple, а не в Silex, как это было в 1.3, и аргументом его метода register является контейнер Pimple, а не приложение Silex (которое расширяет класс контейнера Pimple). PHPStorm помечает это как фатальную ошибку PHP (объявление должно быть совместимо с ServiceProviderInterface -> register (pimple: \ Pimple \ Container)). Я не уверен, что проверка в PHPStorm слишком жесткая или это серьезная проблема.

Другие сообщения указывают, что вы не можете просто переопределить определения интерфейса (Можете ли вы переопределить методы интерфейса с другими, но "совместимый", подписи?) (также http://php.net/manual/en/language.oop5.interfaces.php).

Я только что решил свою проблему. Примечания поставщика Silex 2.0 указывают на то, что вы можете реализовать метод register с контейнером $ app в качестве аргумента, где $ app является экземпляром Silex \ Application. PHPStorm больше не возражает против метода регистрации в UserServiceProvider. Я продолжаю публиковать это в случае, если кто-то еще сталкивается с этой проблемой.

0

Решение

Немного дополнительной информации после дальнейшей отладки. SimpleUser UserServiceProvider был реализован для Silex 1.3 с Silex \ ServiceProviderInterface и Silex \ ControllerProviderInterface, где ServiceProviderInterface предоставлял методы регистрации и загрузки.

В Silex 2.0 ServiceProviderInterface предоставляет только метод register и теперь находится в пространстве имен Pimple. BootableProviderInterface может предоставить метод загрузки, а ControlleProviderInterface — метод connect и находятся в пространстве имен Silex \ API.

SimpleUserProvider должен реализовать все три для работы в Silex2.0. Метод register () теперь требует в качестве аргумента Pimple \ Container, а не Silex \ Application, в то время как методы boot () и connect () по-прежнему имеют Silex \ Application в качестве первого аргумента.

Например
класс UserServiceProvider реализует
ServiceProviderInterface,
BootableProviderInterface,
ControllerProviderInterface
{
регистр публичной функции (Контейнер $ app) {

}
публичная функция загрузки (приложение $ app) {

}
публичная функция connect (приложение $ app) {
….
}

}

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]