Symfony2 覆盖 Sonata 媒体图像提供者。(将接口传递给构造函数)
Symfony2 Overriding Sonata media Image provider.(Passing interface to constructor)
我想覆盖 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
现在我没主意了。我还能尝试什么?
Sonata 基础提供程序在其构造函数中有 2 个可选参数 - $allowedExtensions 和 $allowedMimeTypes。
因为您将数组传递给 class,所以存在一个隐藏的错误,即您只填充前 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
也可以在this上看看。它描述了您可以覆盖服务的方式。我认为这是更明确的方法。例如,要覆盖生成器 class 我这样使用它:
myown.media.provider.file:
class: Application\MediaBundle\Provider\DemoProvider
parent: sonata.media.provider.file
tags:
- { name: sonata.media.provider }
calls:
- [setGenerator, ["@my_own_generator"]]
我想覆盖 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
现在我没主意了。我还能尝试什么?
Sonata 基础提供程序在其构造函数中有 2 个可选参数 - $allowedExtensions 和 $allowedMimeTypes。
因为您将数组传递给 class,所以存在一个隐藏的错误,即您只填充前 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
也可以在this上看看。它描述了您可以覆盖服务的方式。我认为这是更明确的方法。例如,要覆盖生成器 class 我这样使用它:
myown.media.provider.file:
class: Application\MediaBundle\Provider\DemoProvider
parent: sonata.media.provider.file
tags:
- { name: sonata.media.provider }
calls:
- [setGenerator, ["@my_own_generator"]]