Comment faire pour obtenir l'adresse url complète pour un actif dans le Contrôleur?
J'ai besoin de générer le contenu JSON dans le contrôleur et j'ai besoin d'obtenir l'URL complète d'une image téléchargée trouve ici : /web/uploads/myimage.jpg
.
Comment puis-je obtenir l'adresse url complète de celui-ci?
http://www.mywebsite.com/uploads/myimage.jpg
Vous devez vous connecter pour publier un commentaire.
Vous pouvez générer l'url de l'objet requête:
Vous pourriez faire une extension twig qui coupe le
/web
partie 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 mise en œuvre solide.Aussi, Brindille a accès à la demande à partir de
app.request
.$request = $this->getRequest();
getRequest()
est dépréciée en faveur de l'injection de laRequest
objet$request = $this->container->get('request');
lorsque vous ne pouvez pas injecter de l'objet de la Requête (par exemple, l'écrasement setContainer() qui a une signature prédéfinie)Vous pouvez utiliser ce Contrôleur:
EDIT : Cette méthode comprend également l'
app.php
etapp_dev.php
à l'url. Sens cela ne fonctionnera que dans la production lors de l'url-rewriting est activé!app_dev.php
url, un actif sera ajouté à cette url, par exemplehttp://bla.com/app_dev.php/uploads/test.png
- qui n'existe pas.Vous pouvez utiliser le
templating.helper.assets
service.D'abord définir votre les actifs de l'URL de base :
Puis il suffit d'appeler le service à partir de votre contrôleur, de commande ou de l'endroit où vous vous trouvez :
templating.helper.assets
est disponible uniquement lorsquephp
moteur de template est activé.assets.packages
.Si vous souhaitez obtenir cette url dans un template twig utilisation:
De Symfony 2.1 vous pouvez utiliser:
Note: Cette solution a l'avantage de travailler dans les deux DEV et PROD environnements.
La meilleure solution serait à mon humble avis à regarder
Twig
's la mise en œuvre deasset
, que vous pouvez trouver dans:dans la méthode:
qui utilise essentiellement le
templating.helper.assets
service similaire à @iamdto réponse:Ou utiliser directement le
AssetsExtension
service ou une catégorie, respectivement.ce pour éviter le problème de app_dev.php
Méthode
app.request.uriForPath()
donne une URL absolue à partir d'un chemin. Helperasset()
donne le chemin d'un actif.Il est important d'avoir les deux pour le cas où la demande n'est pas à la racine du domaine, par exemple:
Cette solution ne nécessite pas l'ajout d'une variable ou d'un paramètre de config et c'est la même fonction qui est utilisée par Brindille pour
{{ absolute_url() }}
L'url complète de votre bien-être sur
$assetFullUrl
Celui-ci fonctionne pour moi
L' @Al Jey solution fonctionne très bien avec Assetic (testé sur Symfony 2.6)
Solution de travail dans Symfony 3.3+
Pour l'obtenir dans votre action de contrôleur:
Vous pouvez maintenant ajouter votre image e-g:
$baseUrl . '/uploads/' . $image
ou si vous le souhaitez, vous pouvez définir téléchargé actifs url de base dans la configuration.yml et accéder au contrôleur de l'action.Meilleure chose à propos de cette solution serait la possibilité de définir à l'avance pour différents environnements d'e-g: dans
config.yml
,config_dev.yml
etconfig_test.yml
ainsi, lorsque vous déplacez votre projet entre les différents environnements, vous n'avez pas à le changer, comme c'est déjà là..Cheers!
Pour les réseaux de diffusion de contenu, vous pouvez également injecter la
Packages
directement dans votre service.D'abord la base d'actifs de l'url dans la config.yml:
Ensuite la partie la plus amusante:
Si vous avez permettra à l'autowiring activé, alors vous n'aurez pas besoin de configurer quoi que ce soit dans votre
services.yml
, sinon quelque chose comme:Vous pouvez obtenir l'url du site que je.e point de dossier web en utilisant le code suivant
$protocol = stripos($_SERVER['SERVER_PROTOCOL'],'https') === true ? " https://' : 'http://';