Sonata Media Bundle:访问媒体网址

Posted

技术标签:

【中文标题】Sonata Media Bundle:访问媒体网址【英文标题】:Sonata Media Bundle : acces media url 【发布时间】:2013-05-14 07:24:09 【问题描述】:

我正在使用sonata media bundle。

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

有什么建议吗?

【问题讨论】:

sonata-project.org/bundles/media/master/doc/reference/… 【参考方案1】:

@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;
    

【讨论】:

【参考方案2】:

您可以使用:% path media, 'reference' %

@Blauesocke - 尝试了您的解决方案,文件提供者使用两者的结果完全相同

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

%  path sonata_admin.value, 'reference' %

【讨论】:

【参考方案3】:

由于@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) 

【讨论】:

刚刚在 GitHub 上添加了这个:github.com/SocialbitGmbH/SonataMediaTwigExtensionBundle【参考方案4】:

但是,如果您不想在此处渲染媒体而只是将 url 存储在变量中,则需要向媒体提供者询问公共 url。 这是我的情况,我需要将 url 传递给另一个模板。 我在我的 Twig Extension 中创建了一个自定义函数(参见此处:http://symfony.com/doc/current/cookbook/templating/twig_extension.html)。

假设您的扩展服务中有可用的容器$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') %

例如

问候

【讨论】:

【参考方案5】:

您必须使用 path 媒体助手:

% path media, 'small' %

在上面的代码中,media 是媒体实体的一个实例,small 是选择的格式。

http://sonata-project.org/bundles/media/master/doc/reference/helpers.html#twig-usage

【讨论】:

以上是关于Sonata Media Bundle:访问媒体网址的主要内容,如果未能解决你的问题,请参考以下文章

Sonata Media Bundle 安装错误

如何在 Sonata Media Bundle 中实现多对多关系

Symfony2 Sonata Media Bundle -- 上传图片时出错

Sonata media bundle 如何启用 pixlr 编辑?

Sonata Media Bundle Custom Provider 未映射请求数据

Symfony Sonata Media Bundle 向用户添加图像/视频