如何在Symfony控制器中获取资产img url

Tom*_*Tom 13 assets symfony twig

我在Symfony 2.7.10中使用资产,我想在控制器中生成一个图像URL.

在symfony config.yml文件中,我添加了以下设置:

framework:
    assets:
          version: '311nk2'
          version_format: '%%s?v=%%s'
          base_path: /bundles/myBundleName
Run Code Online (Sandbox Code Playgroud)

在twig中生成一个url工作正常,所以使用以下twig代码:

{{ asset('images/logo.png') }}
Run Code Online (Sandbox Code Playgroud)

它产生:

/bundles/myBundleName/images/logo.png?v=311nk2
Run Code Online (Sandbox Code Playgroud)

现在我想在控制器中生成相同的URL,这怎么可能?

Art*_*iel 23

好吧,看到这个答案在当时得到一点关注,我应该指出两件事:

  • 当我们在SO中仍然使用基于版本的标记并且最初为Sf2添加了问题时,添加了这个答案
  • 从那时起,事情发生了很大的变化,所以我要扩展答案

如何使用Container服务处理Symfony 2.8.36的资产URL :

public function indexAction(Request $request)
{
    /** @var \Symfony\Bundle\FrameworkBundle\Templating\Helper\AssetsHelper $manager */
    $manager = $this->get('templating.helper.assets');

    return $this->render('default/index.html.twig', array(
        'base_dir' => realpath($this->container->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR,
        'logo' => $manager->getUrl('bundles/myBundleName/images/logo.png'),
    ));
}
Run Code Online (Sandbox Code Playgroud)

如何使用Container服务和新的Autowire配置处理Symfony 3.4.6的资产URL :

public function indexAction(Request $request)
{
    /** @var \Symfony\Component\Asset\Packages $manager */
    $manager = $this->get('assets.packages');

    return $this->render('default/index.html.twig', [
        'base_dir' => realpath($this->getParameter('kernel.project_dir')).DIRECTORY_SEPARATOR,
        'logo' => $manager->getUrl('bundles/myBundleName/images/logo.png'),
    ]);
}
Run Code Online (Sandbox Code Playgroud)

public function autowireAction(Request $request, \Symfony\Component\Asset\Packages $assetsManager)
{
    return $this->render('default/index.html.twig', [
        'base_dir' => realpath($this->getParameter('kernel.project_dir')).DIRECTORY_SEPARATOR,
        'logo' => $assetsManager->getUrl('bundles/myBundleName/images/logo.png'),
    ]);
}
Run Code Online (Sandbox Code Playgroud)

如何使用Autowire配置处理Symfony 4.0的资产URL:

public function indexAction(Request $request, \Symfony\Component\Asset\Packages $assetsManager)
{
    $path = $assetsManager->getUrl('bundles/myBundleName/images/logo.png');
}
Run Code Online (Sandbox Code Playgroud)

对于Symfony 4,有几点需要了解:

  • 项目的骨架已经发生了一些变化,现在您必须包含您将需要的软件包.在这种情况下,默认情况下不包括资产管理,因此为了使此服务正常工作,您需要执行composer require symfony/asset.

原始答案截至2016年3月22日

使用调用的帮助程序服务templating.helper.assets可以解决问题.尝试这样的事情:

var_dump($this->get('templating.helper.assets')->getUrl('bundles/myBundleName/images/logo.png'));
Run Code Online (Sandbox Code Playgroud)


小智 9

如果您使用symfony 3.4+与自动连接,您可以DI包实例并使用它.例如说控制器动作功能:

public function myAction(Packages $assetPackage)
{
   $url = $assetPackage->getUrl('css/main-ie.css');
}
Run Code Online (Sandbox Code Playgroud)

  • 确实,要使用的包是下一个:use Symfony\Component\Asset\Packages; (2认同)

B. *_*oak 6

但在symfony 3.它不再工作了.

在symfony 3中使用

$this->container->get('assets.packages')->getUrl($path);
Run Code Online (Sandbox Code Playgroud)

防爆.

private function getAssets($path)
{
    return $this->container->get('assets.packages')->getUrl($path);
}

$this->getAssets(...your path...);
Run Code Online (Sandbox Code Playgroud)