Come ottenere l'URL completo di un asset in controller?
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
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 ??strong>:. 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;