3

カスタム プロバイダーの記述方法については、公式ドキュメントに例がありますが、機能しません。

私の質問は、カスタム プロバイダーを作成する最良の方法、特にプロバイダーを作成して新しいサービスとして登録する方法を教えてください。

ドキュメントからこのコードを使用しようとすると、引数の型に関するエラーが発生します。空論 とはどういう意味ですか?

ありがとうございました。

4

2 に答える 2

7

いくつかの調査の後、次のコードが機能します。

プロバイダーをサービスとして登録します。

// 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を作成しました。

于 2013-07-15T12:36:20.923 に答える
0

オーバーライドしていたサービスとまったく同じ名前をサービスに付けるまで、これを機能させることができませんでした(sonata.media.provider.image)

https://stackoverflow.com/a/20118256/4239642を参照してください。

于 2015-05-08T10:55:44.823 に答える