Question

Je dois générer un contenu JSON dans le contrôleur et je dois obtenir l'URL complète à 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

Était-ce utile?

La solution

Vous pouvez générer l'URL de l'objet de la demande:

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

Vous pouvez faire une extension de branche qui coupe la partie de /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.

En outre, Brindille a accès à la demande de app.request.

Autres conseils

Vous pouvez utiliser ce dans le contrôleur:

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

EDIT: Cette méthode comprend également la app.php et app_dev.php à l'URL. Signification cela ne fonctionnera que dans la production lors de réécriture url est activé !

Vous pouvez utiliser le service templating.helper.assets.

Tout d'abord définir votre URL de base d'actifs :

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

Ensuite il suffit d'appeler le service à partir de votre contrôleur, commande ou où que vous soyez:

<?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();
    }
}

Si vous voulez obtenir cette URL à partir d'une utilisation du modèle de brindille:

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

symfony 2.1 vous pouvez utiliser:

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

Remarque :. Cette solution a l'avantage de travailler dans deux et environnements DEV PROD

La meilleure solution serait à mon humble avis à regarder la mise en œuvre de Twig de asset, que vous pouvez trouver dans:

\Symfony\Bundle\TwigBundle\Extension\AssetsExtension

dans le procédé:

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

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

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

Ou utiliser directement respectivement le service AssetsExtension ou classe.

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

Cela permet d'éviter le problème de app_dev.php

Cette solution ne nécessite pas l'ajout d'une variable ou un paramètre sur config et est la même fonction qui est utilisée par Brindille 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

Celui-ci fonctionne pour moi

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

Méthode app.request.uriForPath() donne une URL absolue d'un chemin. Aide asset() donne le chemin d'un actif.

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

Il est important d'avoir à la fois pour le cas où la demande est à la racine du domaine, par exemple:

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

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

{% image '@AcmeBundle/Resources/public/images/myimage.jpg' %} 
    <img src="{{ app.request.uriForPath(asset_url) }}"> 
{% endimage %}

Solution de travail dans symfony 3.3 +

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

Pour obtenir dans votre action de commande:

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

Vous pouvez maintenant ajouter votre image ë-g: $baseUrl . '/uploads/' . $image ou si vous aimez vous pouvez définir des actifs téléchargés dans config.yml Base de l'URL et l'accès en action du contrôleur

.

La meilleure chose à propos de cette solution serait la possibilité de prédéfinir pour différents par exemple les environnements: dans config.yml, config_dev.yml et config_test.yml donc lorsque vous déplacez votre projet entre les différents environnements, vous ne devez pas changer comme il est déjà là ..

Vive!

Pour CDNs, vous pouvez aussi injecter le Packages directement dans votre service.

D'abord la base d'actifs url dans config.yml:

framework:
    assets:
        base_url:
            - 'http://cdn.mysite.com'

Ensuite, la partie amusante:

namespace App\Service;

use Symfony\Component\Asset\Packages;

class SomeClass
{
    private $packages;

    public function __construct(Packages $packages)
    {
        $this->packages = $packages;
    }

    public function proxyToAssetUrl(string $path): string
    {
        return $this->packages->getUrl($path);
    }
}

Si vous avez Autowiring activé, vous aurez pas besoin de quoi que ce soit dans votre configuration services.yml, sinon quelque chose comme:

services:
    App\Service\SomeClass:
        class: App\Service\SomeClass
        arguments: ['@assets.packages']

Vous pouvez utiliser la fonction getSchemeAndHttpHost () Obtient le système hôte et et HTTP utiliser la fonction getBasePath () pour obtenir le chemin de la racine à partir de laquelle cette demande est exécutée

$request->getSchemeAndHttpHost().$request->getBasePath()."/uploads/myimage.jpg"

Cette méthode fonctionne très bien pour la app.php et app_dev.php.

Vous pouvez obtenir le point le site url i.e. dans le dossier Web en utilisant le code suivant

$ = protocole strpos ($ _ SERVER [ 'SERVER_PROTOCOL'], 'https') === vrai? '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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top