51 votes

Comment obtenir l'url complète d'un actif dans le contrôleur ?

Je dois générer du contenu JSON dans le contrôleur et j'ai besoin d'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

57voto

solarc Points 1744

Vous pouvez générer l'url à partir de l'objet de la demande :

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

Vous pourriez fabriquer une extension de brindille qui coupe le /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 mise en œuvre plus solide.

De plus, Twig a accès à la requête de app.request .

5 votes

$request = $this->getRequest();

9 votes

getRequest() est déprécié au profit de l'injection de l'élément Request objet

1 votes

$request = $this->container->get('request'); lorsque vous ne pouvez pas injecter l'objet Request (par exemple, en écrasant setContainer() qui a une signature prédéfinie)

43voto

smatyas Points 655

Vous pouvez l'utiliser dans le contrôleur :

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

EDIT : Cette méthode comprend également la app.php y app_dev.php à l'url. Signification cela ne fonctionnera en production que si la réécriture d'url est activée. !

2 votes

Pour moi, cette solution a également fonctionné dans l'environnement de développement.

3 votes

@RayOnAir, le problème c'est que si vous utilisez la fonction app_dev.php url, un élément d'actif sera ajouté à cette url, par ex. http://bla.com/app_dev.php/uploads/test.png - qui n'existe pas.

2 votes

Ne fonctionne pas dans Symfony 2.5. Ce code retourne l'URL avec le fichier app.php ou app_dev.php inclus dans le chemin. D'ailleurs, il peut être utilisé, mais vous devez utiliser str_replace() pour produire une URL légale.

29voto

iamdto Points 1362

Vous pouvez utiliser le templating.helper.assets service.

Définissez d'abord votre URL de base des actifs :

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

Il suffit ensuite d'appeler le service à partir de votre contrôleur, de votre commande ou de tout autre endroit :

<?php

// src/Acme/Bundle/DemoBundle/Controller/DemoController.php

namespace Acme\Bundle\DemoBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DemoController extends Controller
{
    public function indexAction()
    {
        $myAssetUrl = $this
            ->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();
    }
}

0 votes

C'est une excellente solution, car c'est la plus flexible ! Vous pouvez mettre vos actifs où vous voulez (par exemple un CDN) à l'avenir et seulement changer la valeur assets_base_url dans votre fichier de configuration.

0 votes

Gardez à l'esprit que templating.helper.assets est uniquement disponible lorsque php Le moteur de création de modèles est activé.

0 votes

Avec Symfony 3.0+, le service équivalent pour récupérer les informations sur les actifs en PHP est le suivant assets.packages .

15voto

Al Jey Points 380

Si vous voulez obtenir cette URL à partir d'un modèle twig, utilisez :

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

8 votes

Ou {{ asset('/uploads/myimage.jpg') }}. Non pas que la question concerne une vue, je dis juste qu'il y a un moyen plus facile dans twig =)

5 votes

@MattiasSvensson asset me donne le chemin complet, mais pas l'uri (pas absolu)

0 votes

La question était "en contrôleur" et non en brindille.

12voto

COil Points 295

A partir de Symfony 2.1 que vous pouvez utiliser :

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

Nota : Cette solution a l'avantage de fonctionner en ambos Environnements DEV et PROD.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X