Comment obtenir l’URL complète pour un actif dans Controller?

Je dois générer du contenu JSON dans le contrôleur et je dois obtenir l’URL complète d’une image téléchargée située ici: /web/uploads/myimage.jpg .

Comment puis-je obtenir l’URL complète de celui-ci?

http://www.mywebsite.com/uploads/myimage.jpg

Vous pouvez générer l’URL à partir de l’object de requête:

 $baseurl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath(); 

Vous pouvez créer une extension twig qui coupe la partie /web de votre chemin et utilise la requête pour générer l’URL de base.

voir Symfony\Component\Routing\Generator\UrlGenerator::doGenerate pour une implémentation plus solide.

En outre, Twig a access à la demande depuis app.request .

Vous pouvez l’utiliser dans Controller:

 $this->getRequest()->getUriForPath('/uploads/myimage.jpg'); 

EDIT: Cette méthode inclut également les app.php et app_dev.php dans l’URL. Ce qui signifie que cela ne fonctionnera que dans la production lorsque la réécriture d’url est activée !

Vous pouvez utiliser le service templating.helper.assets .

Définissez d’abord l’ URL de base de vos actifs :

 # app/config/config.yml framework: templating: assets_base_url: "http://www.mywebsite.com/" 

Ensuite, appelez simplement le service depuis votre contrôleur, commande ou où que vous soyez:

 get('templating.helper.assets') ->getUrl('bundles/acmedemo/js/main.js', $packageName = null) ; // $myAssetUrl is "http://www.mywebsite.com/bundles/acmedemo/js/main.js" return array(); } } 

Si vous voulez obtenir cette URL depuis un modèle de brindille, utilisez:

 {{ app.request.uriForPath('/uploads/myimage.jpg') }} 

La meilleure solution serait IMHO pour examiner la mise en œuvre de Twig , que vous pouvez trouver dans:

 \Symfony\Bundle\TwigBundle\Extension\AssetsExtension 

dans la méthode:

 public function getAssetUrl($path, $packageName = null, $absolute = false, $version = null) 

qui utilise essentiellement le service templating.helper.assets similaire à la réponse de @ iamdto:

 $url = $this->container->get('templating.helper.assets')->getUrl($path, $packageName, $version); 

Ou utilisez directement le service ou la classe AssetsExtension , respectivement.

A partir de Symfony 2.1, vous pouvez utiliser:

 $request->getSchemeAndHttpHost(). '/uploads/myimage.jpg'; 

Remarque : cette solution présente l’avantage de fonctionner à la fois dans les environnements DEV et PROD.

 app.request.uriForPath('/uploads/myimage.jpg') | replace({'/app_dev.php': ''}) 

cela évite le problème de app_dev.php

Celui-ci travaille pour moi

 $baseurl = $this->getRequest()->getScheme() . '://' . $this->getRequest()->getHttpHost() . $this->getRequest()->getBasePath(); 

La méthode app.request.uriForPath() donne une URL absolue à partir d’un chemin. Helper asset() donne le chemin d’un actif.

 {{ app.request.uriForPath(asset('bundles/mybundle/images/name.png')) }} 

Il est important d’avoir les deux pour le cas où l’application n’est pas à la racine du domaine, par exemple:

 http://mydomain.com/myapp/app.php 

La solution @Al Jey fonctionne bien avec Assetic (testé sur Symfony 2.6)

 {% image '@AcmeBundle/Resources/public/images/myimage.jpg' %}  {% endimage %} 

Cette solution ne nécessite pas l’ajout de variable ou de paramètre sur config et est la même fonction utilisée par Twig pour {{ absolute_url() }}

 public function yourAction(AssetsHelper $assetsHelper, HttpFoundationExtension $httpExtension) { $assetsPath = $assetsHelper->getUrl('/img/test.jpg'); $assetFullUrl = $httpExtension->generateAbsoluteUrl($assetPath); } 

L’URL complète de votre actif sera sur $assetFullUrl

Solution de travail dans Symfony 3.3+

 # app/config/config.yml parameters: ... base_url: 'http://mywebsite.com' 

Pour l’obtenir dans votre action de contrôleur:

 $baseUrl = $this->getParameter('base_url'); 

Vous pouvez maintenant y append votre image, par exemple: $baseUrl . '/uploads/' . $image $baseUrl . '/uploads/' . $image $baseUrl . '/uploads/' . $image ou si vous le souhaitez, vous pouvez définir l’URL de base des éléments téléchargés dans config.yml et y accéder dans l’action du contrôleur.

La meilleure chose à propos de cette solution serait la possibilité de la prédéfinir pour différents environnements, par exemple: config.yml , config_dev.yml et config_test.yml donc lorsque vous déplacez votre projet entre différents environnements, vous n’avez pas à le modifier en tant que c’est déjà là ..

À votre santé!

Pour Twig, cela devrait aussi fonctionner (plus simple):

 {{ url(asset('...')) }} 

Vous pouvez obtenir l’URL du site, c’est-à-dire pointer vers le dossier Web en utilisant le code suivant

$ protocol = ssortingpos ($ _ SERVER [‘SERVER_PROTOCOL’], ‘https’) === true? ‘https: //’: ‘http: //’;

  $hostName = $request->server->get('HTTP_HOST'); $baseDirectory = ""; if(!empty($this->container->get('router')->getContext()->getBaseUrl())){ $baseDirectory = str_replace('app_dev.php', '', $this->container->get('router')->getContext()->getBaseUrl()); } $rootUrl = $protocol.$hostName.$baseDirectory;