Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get assets img url in Symfony controller

I'm using assets in Symfony 2.7.10 and I want to generate an image url in the controller.

In the symfony config.yml file I have added the following setting:

framework:
    assets:
          version: '311nk2'
          version_format: '%%s?v=%%s'
          base_path: /bundles/myBundleName

In twig the generating of an url works ok, so with the following twig code:

{{ asset('images/logo.png') }}

It generates:

/bundles/myBundleName/images/logo.png?v=311nk2

Now I want to generate the same url in a controller, how is this possible?

like image 507
Tom Avatar asked Mar 22 '16 19:03

Tom


3 Answers

All right, seeing that this answer get a little bit of attention over the time, I should point out two things:

  • This answer was added when we still had version based tagging in SO and the question was originally added for Sf2
  • Since then, things changed quite a bit, so I'm gonna extend the answer

How to handle asset url for Symfony 2.8.36 using the Container service:

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'),
    ));
}

How to handle asset url for Symfony 3.4.6 using Container service and the new Autowire configuration:

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'),
    ]);
}

and

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'),
    ]);
}

How to handle asset url for Symfony 4.0 only with Autowire configuration:

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

For Symfony 4 there are few things to know:

  • The skeleton of the project has changed a bit, and now you are have to include the packages that you are going to need. In this case, by default Assets management is not included, so in order for this service to work you need to execute composer require symfony/asset.

Original answer as of 22.03.2016

Using the helper service called templating.helper.assets could do the trick. Try something like this:

var_dump($this->get('templating.helper.assets')->getUrl('bundles/myBundleName/images/logo.png'));
like image 78
Artamiel Avatar answered Oct 17 '22 16:10

Artamiel


if you are using symfony 3.4+ with auto-wiring you can DI the Packages instance and use that. eg say for a controller action function:

use Symfony\Component\Asset\Packages;

public function myAction(Packages $assetPackage)
{
   $url = $assetPackage->getUrl('css/main-ie.css');
}
like image 29
runawaycoin Avatar answered Oct 17 '22 17:10

runawaycoin


But in symfony 3. It's not working anymore.

In symfony 3 use

$this->container->get('assets.packages')->getUrl($path);

Ex.

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

$this->getAssets(...your path...);
like image 6
B. Godoak Avatar answered Oct 17 '22 18:10

B. Godoak