Symfony 索纳塔媒体包:访问媒体url

Symfony 索纳塔媒体包:访问媒体url,symfony,twig,sonata-admin,Symfony,Twig,Sonata Admin,我正在使用 我想知道如何访问twig中的媒体url。 我只想要网址,我不需要显示媒体 有什么建议吗?您必须使用路径媒体助手: {% path media, 'small' %} 在上述代码中,media是媒体实体的实例,small是所选格式 但是,如果您不想在此处呈现媒体,而只是将url存储在变量中,则需要向媒体提供商询问公共url。 这就是我的情况,我需要将url传递给另一个模板。 我在我的小枝扩展中创建了一个自定义函数(请参见此处:) 如果您的扩展服务中有可用的容器和$this->cont

我正在使用

我想知道如何访问twig中的媒体url。
我只想要网址,我不需要显示媒体


有什么建议吗?

您必须使用路径媒体助手:

{% path media, 'small' %}
在上述代码中,
media
是媒体实体的实例,
small
是所选格式


但是,如果您不想在此处呈现媒体,而只是将url存储在变量中,则需要向媒体提供商询问公共url。 这就是我的情况,我需要将url传递给另一个模板。 我在我的小枝扩展中创建了一个自定义函数(请参见此处:)

如果您的扩展服务中有可用的容器和
$this->container
,您可以这样做:

public function getMediaPublicUrl($media, $format)
{
    $provider = $this->container->get($media->getProviderName());

    return $provider->generatePublicUrl($media, $format);
}
在扩展中注册函数:

public function getFunctions() {
     ....
    'media_public_url' => new \Twig_Function_Method($this, 'getMediaPublicUrl'),
     ....
    );
}
并从模板中调用新助手:

{% set img_url = media_public_url(media, 'small') %}
比如说


关于

由于@javigzz的回答对我不起作用,这里有一个与最新版本的sonata_media配合使用的树枝扩展:

namespace Socialbit\SonataMediaTwigExtensionBundle\Twig;

use Sonata\CoreBundle\Model\ManagerInterface;
use Symfony\Component\DependencyInjection\Container;

Class:
/**
 * Description of MediaPathExtension
 *
 * @author thomas.kekeisen
 */
class MediaPathExtension extends \Twig_Extension
{
    /**
     *
     * @var type Container
     */
    protected $container;

    /**
     *
     * @var type ManagerInterface
     */
    protected $mediaManager;

    public function __construct(Container $container, $mediaManager)
    {
        $this->container = $container;
        $this->mediaManager = $mediaManager;
    }

    public function getFunctions()
    {
        return array
        (
            'media_public_url' => new \Twig_Function_Method($this, 'getMediaPublicUrl')
        );
    }

    /**
     * @param mixed $media
     *
     * @return null|\Sonata\MediaBundle\Model\MediaInterface
     */
    private function getMedia($media)
    {
        $media = $this->mediaManager->findOneBy(array(
            'id' => $media
        ));

        return $media;
    }

    public function getMediaPublicUrl($media, $format)
    {
        $media = $this->getMedia($media);

        $provider = $this->container->get($media->getProviderName());

        return $provider->generatePublicUrl($media, $format);
    }

    public function getName()
    {
        return 'SocialbitSonataMediaTwigExtensionBundleMediaPathExtension';
    }
}
services.yml:

services:
    socialbit.sonatamediatwigextensionbundle.mediapathextension:
        class: Socialbit\SonataMediaTwigExtensionBundle\Twig\MediaPathExtension
        public: false
        arguments:
            - @service_container
            - @sonata.media.manager.media
        tags:
            - { name: twig.extension }
用法相同:

{% set img_url = media_public_url(media, 'reference') %}
{{ dump(img_url) }}

您可以使用:
{%path媒体,'引用'%}

@Blauesocke-尝试了您的解决方案,并使用这两种方法为文件提供程序获得了完全相同的结果

{% set img_url = media_public_url(media, 'reference') %}
{{ dump(img_url) }}


@在默认上下文的情况下,javigzz是完美的。我使用自定义上下文,因此必须首先处理$format,并考虑上下文名称:

$provider = $this->container->get($media->getProviderName());
$format = $provider->getFormatName($media, $format);
$url = $provider->generatePublicUrl($media, $format);
附加说明 由于注入容器不是最佳做法,因此最好从提供程序池获取提供程序:

class Foo {
    public function __construct(Sonata\MediaBundle\Provider\Pool $pool) {
        $this->pool = $pool;
    }

    public function getUrl($media, $format) {
        $provider = $this->pool->getProvider($media->getProviderName());
        $format = $provider->getFormatName($media, $format);
        $url = $provider->generatePublicUrl($media, $format);

        return $url;
    }
}
刚刚在GitHub上添加了以下内容:
class Foo {
    public function __construct(Sonata\MediaBundle\Provider\Pool $pool) {
        $this->pool = $pool;
    }

    public function getUrl($media, $format) {
        $provider = $this->pool->getProvider($media->getProviderName());
        $format = $provider->getFormatName($media, $format);
        $url = $provider->generatePublicUrl($media, $format);

        return $url;
    }
}