encore symfony assetic

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