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;