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?
Très bien, vu que cette réponse attire un peu l'attention au fil du temps, je dois souligner deux choses:
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:
composer require symfony/asset
.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'));
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');
}
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...);