Domanda

Ho bisogno di generare alcuni contenuti JSON nel controllore e ho bisogno di ottenere l'URL completo per un'immagine caricata situato qui:. /web/uploads/myimage.jpg

Come posso ottenere l'URL completo di esso?

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

È stato utile?

Soluzione

È possibile generare l'URL dall'oggetto richiesta:

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

Si potrebbe fare un estensione ramoscello che taglia la parte /web del percorso e utilizza la richiesta per generare l'URL di base.

vedi Symfony\Component\Routing\Generator\UrlGenerator::doGenerate per una più solida implementazione.

Inoltre, Ramoscello ha accesso alla richiesta app.request.

Altri suggerimenti

È possibile utilizzare questo controller:

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

Modifica Questo metodo include anche la app.php e app_dev.php all'URL. Significato Questo sarà solo il lavoro nella produzione quando url-rewriting è abilitato !

È possibile utilizzare il servizio templating.helper.assets.

In primo luogo definire il tuo patrimonio di base URL :

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

Poi basta chiamare il servizio da dentro il controller, comando o ovunque ci si trovi:

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

Se si desidera ottenere questo URL dall'interno di un uso template ramoscello:

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

Da symfony 2.1 si può usare:

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

Nota :. Questa soluzione ha il vantaggio di lavorare in sia ambienti dev e PROD

La soluzione migliore sarebbe quella di guardare IMHO implementazione di Twig di asset, che potete trovare in:

\Symfony\Bundle\TwigBundle\Extension\AssetsExtension

nel metodo:

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

che utilizza fondamentalmente il servizio templating.helper.assets simile a @ di iamdto risposta:

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

In alternativa, utilizzare direttamente il servizio AssetsExtension o di classe, rispettivamente.

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

questo evitare il problema di app_dev.php

Questa soluzione non richiede l'aggiunta di qualsiasi variabile o parametro di configurazione ed è la stessa funzione che viene utilizzato da Twig per {{ absolute_url() }}

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

l'URL completo del vostro bene sarà in $assetFullUrl

Questo funziona per me

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

Metodo app.request.uriForPath() dà un URL assoluto da un percorso. Helper asset() dà il percorso di un bene.

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

E 'importante avere sia per il caso in cui l'applicazione non è alla radice del dominio, per esempio:

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

La soluzione @Al Jey funziona bene con Assetic (testato su Symfony 2.6)

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

La soluzione di lavoro in Symfony 3.3 +

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

Per ottenere nella vostra azione di controllo:

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

È ora possibile aggiungere la vostra immagine ad esso e-g: $baseUrl . '/uploads/' . $image o se, come si può definire asset caricati basare url nella config.yml e accedervi in ??azione di controllo

.

La cosa migliore di questa soluzione sarebbe la possibilità di predefinire per diversi ambienti ad esempio: in config.yml, config_dev.yml e config_test.yml in modo che quando si sposta il progetto tra i diversi ambienti, non c'è bisogno di cambiarla come è già lì ..

Cheers!

Per CDN, è anche possibile iniettare il Packages direttamente nel vostro servizio.

In primo luogo la base patrimoniale url in config.yml:

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

Poi la parte divertente:

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

Se avete attivato autowiring allora non sarà necessario configurare nulla nel vostro services.yml, altrimenti qualcosa come:

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

È possibile utilizzare la funzione di getSchemeAndHttpHost () per Ottiene lo schema e HTTP host e utilizzare la funzione getBasePath () per ottenere il percorso radice da cui viene eseguita la richiesta

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

Questo metodo funziona bene per l'app.php e app_dev.php.

È possibile ottenere il punto sito url cioè alla cartella Web utilizzando il seguente codice

$ Protocollo = stripos ($ _ SERVER [ 'SERVER_PROTOCOL'], 'https') === vero? '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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top