web-dev-qa-db-fra.com

Comment obtenir l'URL de l'image des actifs dans le contrôleur Symfony

J'utilise des actifs dans Symfony 2.7.10 et je veux générer une URL d'image dans le contrôleur.

Dans le fichier symfony config.yml, j'ai ajouté le paramètre suivant:

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

Dans twig la génération d'une URL fonctionne bien, donc avec le code twig) suivant:

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

Il génère:

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

Maintenant, je veux générer la même URL dans un contrôleur, comment est-ce possible?

14
Tom

Très bien, vu que cette réponse attire un peu l'attention au fil du temps, je dois souligner deux choses:

  • Cette réponse a été ajoutée lorsque nous avions encore un balisage basé sur la version dans SO et la question a été initialement ajoutée pour Sf2
  • Depuis lors, les choses ont beaucoup changé, donc je vais étendre la réponse

Comment gérer l'URL de l'actif pour Symfony 2.8.36 en utilisant le service Container:

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

Comment gérer l'URL de l'actif pour Symfony 3.4.6 en utilisant le service Container et la nouvelle configuration Autowire:

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

et

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

Comment gérer l'URL de l'actif pour Symfony 4.0 uniquement avec la configuration Autowire:

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

Pour Symfony 4, il y a peu de choses à savoir:

  • Le squelette du projet a un peu changé, et maintenant vous devez inclure les packages dont vous aurez besoin. Dans ce cas, la gestion des actifs par défaut n'est pas incluse, donc pour que ce service fonctionne, vous devez exécuter composer require symfony/asset.

Réponse originale au 22.03.2016

Utilisation du service d'assistance appelé templating.helper.assets pourrait faire l'affaire. Essayez quelque chose comme ceci:

var_dump($this->get('templating.helper.assets')->getUrl('bundles/myBundleName/images/logo.png'));
25
Artamiel

si vous utilisez symfony 3.4+ avec le câblage automatique, vous pouvez DI l'instance Packages et l'utiliser. Par exemple, pour une fonction d'action du contrôleur:

public function myAction(Packages $assetPackage)
{
   $url = $assetPackage->getUrl('css/main-ie.css');
}
11
runawaycoin

Mais dans symfony 3. Ça ne marche plus.

Dans symfony 3, utilisez

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

Ex.

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

$this->getAssets(...your path...);
6
B. Godoak