Symfony2 Переопределение Sonata media Image провайдера. (Передача интерфейса в конструктор)

Я хочу переопределить поставщик изображений SonataMediaBundle, однако, когда я переопределяю его, я получаю ошибку, когда вызывается конструктор:

Catchable Fatal Error: Argument 8 passed to Application\Sonata\MediaBundle\Provider\NewImageProvider::__construct() must be an instance of Imagine\Image\ImagineInterface, none given

Это конструктор:

/**
* @param string                                                $name
* @param \Gaufrette\Filesystem                                 $filesystem
* @param \Sonata\MediaBundle\CDN\CDNInterface                  $cdn
* @param \Sonata\MediaBundle\Generator\GeneratorInterface      $pathGenerator
* @param \Sonata\MediaBundle\Thumbnail\ThumbnailInterface      $thumbnail
* @param array                                                 $allowedExtensions
* @param array                                                 $allowedMimeTypes
* @param \Imagine\Image\ImagineInterface                       $adapter
* @param \Sonata\MediaBundle\Metadata\MetadataBuilderInterface $metadata
*/
public function __construct($name, Filesystem $filesystem, CDNInterface $cdn, GeneratorInterface $pathGenerator, ThumbnailInterface $thumbnail, array $allowedExtensions = array(), array $allowedMimeTypes = array(), ImagineInterface $adapter, MetadataBuilderInterface $metadata = null)
{
parent::__construct($name, $filesystem, $cdn, $pathGenerator, $thumbnail, $allowedExtensions, $allowedMimeTypes, $metadata);

$this->imagineAdapter = $adapter;
}

Как видите, аргумент 8 требует интерфейса. Прямо сейчас в моем служении я не передаю 8-й аргумент:

sonata.media.provider.image:
class: %application_sonata_media.image_class%
arguments:
- [sonata.media.provider.image]
- [@sonata.media.filesystem.local]
- [@sonata.media.cdn.server]
- [@sonata.media.generator.default]
- [@sonata.media.thumbnail.format]
- [@sonata.media.buzz.browser]
- [@sonata.media.metadata.proxy]
tags:
- { name: sonata.media.provider }
calls:
- [ setTemplates, [ { helper_thumbnail: SonataMediaBundle:Provider:thumbnail.html.twig, helper_view: SonataMediaBundle:Provider:view_youtube.html.twig } ] ]

Я пытался передать его по-разному, например (= массив дан):

     arguments:
- [sonata.media.provider.image]
- [@sonata.media.filesystem.local]
- [@sonata.media.cdn.server]
- [@sonata.media.generator.default]
- [@sonata.media.thumbnail.format]
- [@sonata.media.buzz.browser]
- [@sonata.media.metadata.proxy]
- [imagine_interface]

Я даже пытался создать новый сервис, который загружает интерфейс:

test.imagine:
class: Imagine\Image\ImagineInterface

sonata.media.provider.image:
class: %application_sonata_media.image_class%
arguments:
- [sonata.media.provider.image]
- [@sonata.media.filesystem.local]
- [@sonata.media.cdn.server]
- [@sonata.media.generator.default]
- [@sonata.media.thumbnail.format]
- [@sonata.media.buzz.browser]
- [@sonata.media.metadata.proxy]
- [@test.imagine]
tags:
- { name: sonata.media.provider }
calls:
- [ setTemplates, [ { helper_thumbnail: SonataMediaBundle:Provider:thumbnail.html.twig, helper_view: SonataMediaBundle:Provider:view_youtube.html.twig } ] ]

Тогда я получил ошибку:

Cannot instantiate interface Imagine\Image\ImagineInterface

Теперь у меня нет идей. Что еще я могу попробовать?

1

Решение

Базовый поставщик Sonata имеет 2 дополнительных параметра внутри своего конструктора — $ allowedExtensions а также $ AllowedMimeTypes.

Поскольку вы передаете массивы в класс, существует скрытая ошибка, что вы заполняете только первые 7 аргументов (где требуется 8-й).

Вы пошли в правильном направлении, добавив дополнительные аргументы, но их типы были неправильными. Ваша последняя модификация не работает, потому что вы не можете сделать сервис из интерфейса — при условии, что ошибка говорит то же самое)

Попробуйте это (с соответствующим адаптером изображения):

 sonata.media.provider.image:
class: Server\BaseBundle\Provider\ImageProvider
arguments:
- sonata.media.provider.image
- @sonata.media.filesystem.local
- @sonata.media.cdn.server
- @sonata.media.generator.default
- @sonata.media.thumbnail.format
- []
- []
- @sonata.media.adapter.image.gd
- @sonata.media.metadata.proxy
tags:
- { name: sonata.media.provider }
calls:
- [ setTemplates, [ { helper_thumbnail: SonataMediaBundle:Provider:thumbnail.html.twig, helper_view: SonataMediaBundle:Provider:view_youtube.html.twig } ] ]

В сонате есть уже реализованные адаптеры:

  • sonata.media.adapter.image.gd
  • sonata.media.adapter.image.imagick
  • sonata.media.adapter.image.gmagick

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

myown.media.provider.file:
class: Application\MediaBundle\Provider\DemoProvider
parent: sonata.media.provider.file
tags:
- { name: sonata.media.provider }
calls:
- [setGenerator, ["@my_own_generator"]]
1

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

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

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