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 中实现多对多关系
Symfony2 Sonata Media Bundle -- 上传图片时出错
Sonata media bundle 如何启用 pixlr 编辑?