symfony - Sonata Media Bundle - 如何编写自定义提供程序?

标签 symfony provider symfony-sonata

有一个example官方文档中介绍了如何编写自定义提供程序,但它不起作用。

我的问题是:编写自定义提供程序的最佳方法是什么,特别是如何编写提供程序并将其注册为新服务​​?

当我尝试使用this code时从文档中,我收到有关参数类型的错误。 空参数是什么意思?

谢谢。

最佳答案

经过一番调查,以下代码有效:

将提供商注册为服务:

// 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更新过时的文档。

关于symfony - Sonata Media Bundle - 如何编写自定义提供程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17633954/

相关文章:

symfony - 如何在奏鸣曲管理类中获取容器实例?

php - InvalidArgumentException Composer 安装symfony

php - 如何在 Symfony 4.2 中将 Doctrine 实体管理器标记为 "lazy"

javascript - jwt_authentication 请求 ajax - symfony

Flutter 通过 provider 访问推送页面上的 Notifier

firebase - 将用户 uid 传递给 Flutter 中的 Firestore 流查询

flutter - 当我尝试使用提供程序从 ListView 中删除项目时,它在 flutter 中从列表中删除了最后一个元素

symfony - 将自定义分析器应用于具有 Elasticsearch 的字段的正确方法,将多个分析器应用于一个字段或将单个分析器应用于多个字段?

symfony - PHP fatal error : Class 'Application\Sonata\MediaBundle\ApplicationSonataMediaBundle' not found in/var/www/znata. com/app/AppKernel.php 第 47 行