symfony - encore - ¿Cómo obtener la URL completa de un activo en Controller?
symfony 4 assets (14)
Necesito generar contenido JSON en el controlador y necesito obtener la URL completa de una imagen cargada que se encuentra aquí: /web/uploads/myimage.jpg
.
¿Cómo puedo obtener la URL completa de esto?
http://www.mywebsite.com/uploads/myimage.jpg
A partir de Symfony 2.1 , puede usar:
$request->getSchemeAndHttpHost(). ''/uploads/myimage.jpg'';
Nota : Esta solución tiene la ventaja de funcionar en entornos DEV y PROD.
El método app.request.uriForPath()
proporciona una URL absoluta desde una ruta. Helper asset()
da la ruta de un activo.
{{ app.request.uriForPath(asset(''bundles/mybundle/images/name.png'')) }}
Es importante tener ambos para el caso donde la aplicación no está en la raíz del dominio, por ejemplo:
http://mydomain.com/myapp/app.php
Esta funciona para mí
$baseurl = $this->getRequest()->getScheme() . ''://'' . $this->getRequest()->getHttpHost() . $this->getRequest()->getBasePath();
Esta solución no requiere agregar ninguna variable o parámetro en la configuración y es la misma función que usa Twig para {{ absolute_url() }}
public function yourAction(AssetsHelper $assetsHelper, HttpFoundationExtension $httpExtension)
{
$assetsPath = $assetsHelper->getUrl(''/img/test.jpg'');
$assetFullUrl = $httpExtension->generateAbsoluteUrl($assetPath);
}
La URL completa de su activo estará en $assetFullUrl
La mejor solución sería en mi humilde opinión para ver la implementación de asset
de Twig
, que se puede encontrar en:
/Symfony/Bundle/TwigBundle/Extension/AssetsExtension
en el método:
public function getAssetUrl($path, $packageName = null, $absolute = false, $version = null)
que básicamente utiliza el servicio templating.helper.assets similar a la respuesta de @iamdto:
$url = $this->container->get(''templating.helper.assets'')->getUrl($path, $packageName, $version);
O use directamente el servicio o clase AssetsExtension
, respectivamente.
La solución @Al Jey funciona bien con Assetic (probado en Symfony 2.6)
{% image ''@AcmeBundle/Resources/public/images/myimage.jpg'' %}
<img src="{{ app.request.uriForPath(asset_url) }}">
{% endimage %}
Para Twig, esto debería funcionar también (más simple):
{{ url(asset(''...'')) }}
Puede generar la url desde el objeto de solicitud:
$baseurl = $request->getScheme() . ''://'' . $request->getHttpHost() . $request->getBasePath();
Puede hacer una extensión de ramita que corta la parte /web
de su ruta y utiliza la solicitud para generar la url base.
vea Symfony/Component/Routing/Generator/UrlGenerator::doGenerate
para una implementación más sólida.
Además, Twig tiene acceso a la solicitud de app.request
.
Puede obtener la URL del sitio, es decir, apuntar a la carpeta web utilizando el siguiente código
$ protocol = stripos ($ _ SERVER [''SERVER_PROTOCOL''], ''https'') === true? ''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;
Puede usar el servicio templating.helper.assets
.
Primero defina su URL base de activos :
# app/config/config.yml
framework:
templating:
assets_base_url: "http://www.mywebsite.com/"
Luego solo llame al servicio desde su controlador, comando o donde sea que esté:
<?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();
}
}
Puedes usar esto en Controller:
$this->getRequest()->getUriForPath(''/uploads/myimage.jpg'');
EDITAR: Este método también incluye app.php
y app_dev.php
en la url. ¡ Esto significa que solo funcionará en producción cuando esté habilitada la reescritura de URL !
Si desea obtener esta URL dentro de una plantilla de ramita, use:
{{ app.request.uriForPath(''/uploads/myimage.jpg'') }}
Solución de trabajo en Symfony 3.3+
# app/config/config.yml
parameters:
...
base_url: ''http://mywebsite.com''
Para obtenerlo en su acción de controlador:
$baseUrl = $this->getParameter(''base_url'');
Ahora puede agregar su imagen, por ejemplo: $baseUrl . ''/uploads/'' . $image
$baseUrl . ''/uploads/'' . $image
$baseUrl . ''/uploads/'' . $image
o si lo desea, puede definir la URL base de los activos cargados en config.yml y acceder a ella en la acción del controlador.
Lo mejor de esta solución sería la capacidad de predefinirla para diferentes entornos, por ejemplo: en config.yml
, config_dev.yml
y config_test.yml
modo que cuando mueva su proyecto entre diferentes entornos, no tenga que cambiarlo como ya está allí ...
¡Aclamaciones!
app.request.uriForPath(''/uploads/myimage.jpg'') | replace({''/app_dev.php'': ''''})
esto evita el problema de app_dev.php