官方文档中有一个example关于如何编写自定义provider,但是不起作用。
我的问题是:编写自定义提供程序的最佳方法是什么,特别是如何编写提供程序并将其注册为新服务?
当我尝试使用文档中的此代码时,我收到有关参数类型的错误。 空论是什么意思?
谢谢你。
经过一番调查,以下代码有效:
将提供商注册为服务:
// src/Application/Sonata/MediaBundle/Resources/config/services.yml
parameters:
application_sonata_media.custom_class: Application\Sonata\MediaBundle\Provider\CustomProvider
services:
sonata.media.provider.custom:
class: %application_sonata_media.custom_class%
tags:
- { name: sonata.media.provider }
arguments:
- sonata.media.provider.custom
- @sonata.media.filesystem.local
- @sonata.media.cdn.server
- @sonata.media.generator.default
- @sonata.media.thumbnail.format
自定义提供商代码:
// src/Application/Sonata/MediaBundle/Provider/CustomProvider.php
<?php
namespace Application\Sonata\MediaBundle\Provider;
use Sonata\MediaBundle\Model\MediaInterface;
use Sonata\MediaBundle\Provider\FileProvider;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\HttpFoundation\File\File;
/**
* Class CustomProvider
* @package Application\Sonata\MediaBundle\Provider
*/
class CustomProvider extends FileProvider
{
/**
* @param MediaInterface $media
*/
protected function doTransform(MediaInterface $media)
{
// ...
}
/**
* {@inheritdoc}
*/
public function generatePublicUrl(MediaInterface $media, $format)
{
// new logic
}
/**
* {@inheritdoc}
*/
public function postPersist(MediaInterface $media)
{
}
/**
* {@inheritdoc}
*/
public function postUpdate(MediaInterface $media)
{
}
}
更新奏鸣曲配置:
// app/config/sonata/sonata_media.yml
sonata_media:
...
product:
providers:
- sonata.media.provider.image
- sonata.media.provider.custom
formats:
small: { width: 40 , quality: 100}
...
我还设置了 DI 扩展来自动加载
services.yml
我做了一个 PR 来更新过时的文档。
直到我将该服务命名为我正在覆盖的服务(sonata.media.provider.image)时,我才能使其正常工作
是的,该示例并不完整,尽管一旦您需要从 yaml 文件配置提供程序,它就可以像官方文档中提到的那样工作,例如( allowed_extensions:xyz,ijk )或任何高级配置我记得他们在那里称呼它,你到达了文档没有提到的一点,那就是你必须将你的提供者与捆绑配置默认值连接起来的部分。
这可以从完整服务名称和用于配置默认提供程序的短服务名称之间的差异中看出,我没有对此进行太多研究,但确信可以从类本身进行配置,尽管我真的很喜欢将配置保存在一处。
奏鸣曲的开发人员接受新人加入团队吗?我知道已经过去很长时间了,奏鸣曲项目已经成长,但我认为还有很多事情可以改进