Jak uzyskać pełny adres url zasobu w kontrolerze?
Muszę wygenerować zawartość JSON w kontrolerze i uzyskać pełny adres URL do przesłanego obrazu znajdującego się tutaj: /web/uploads/myimage.jpg
.
Jak mogę uzyskać pełny adres url?
http://www.mywebsite.com/uploads/myimage.jpg
14 answers
Możesz wygenerować adres url z obiektu request:
$baseurl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath();
Możesz utworzyć rozszerzenie gałązki, które odcina /web
część ścieżki i używa żądania do generowania bazowego adresu url.
Zobacz Symfony\Component\Routing\Generator\UrlGenerator::doGenerate
aby uzyskać bardziej solidną implementację.
Ponadto, Twig ma dostęp do żądania od app.request
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-11 14:44:31
Możesz użyć tego w kontrolerze:
$this->getRequest()->getUriForPath('/uploads/myimage.jpg');
EDIT: ta metoda zawiera również app.php
i {[2] } do adresu url. Oznacza to, że będzie to działać tylko w produkcji, gdy włączone jest przepisywanie adresów URL !
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-20 15:59:35
Możesz skorzystać z usługi templating.helper.assets
.
Najpierw określ swój adres URL bazy zasobów :
# app/config/config.yml
framework:
templating:
assets_base_url: "http://www.mywebsite.com/"
Następnie po prostu zadzwoń do usługi z kontrolera, komendy lub gdziekolwiek jesteś:
<?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();
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-17 11:50:25
Jeśli chcesz pobrać ten adres url z szablonu gałązki użyj:
{{ app.request.uriForPath('/uploads/myimage.jpg') }}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-14 15:16:38
Najlepszym rozwiązaniem byłoby IMHO przyjrzenie się implementacji Twig
asset
, którą można znaleźć w:
\Symfony\Bundle\TwigBundle\Extension\AssetsExtension
W metodzie:
public function getAssetUrl($path, $packageName = null, $absolute = false, $version = null)
Który w zasadzie korzysta z usługi templating.helper.assets
podobnej do odpowiedzi @iamdto:
$url = $this->container->get('templating.helper.assets')->getUrl($path, $packageName, $version);
Lub bezpośrednio używać odpowiednio usługi lub Klasy AssetsExtension
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-15 13:06:20
Od Symfony 2.1 możesz użyć:
$request->getSchemeAndHttpHost(). '/uploads/myimage.jpg';
Uwaga : To rozwiązanie ma tę zaletę, że działa w zarówno w środowiskach DEV, jak i PROD.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-19 08:22:39
app.request.uriForPath('/uploads/myimage.jpg') | replace({'/app_dev.php': ''})
To pozwala uniknąć problemu app_dev.php
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-25 23:29:04
This one works for me
$baseurl = $this->getRequest()->getScheme() . '://' . $this->getRequest()->getHttpHost() . $this->getRequest()->getBasePath();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-13 09:51:30
Metoda app.request.uriForPath()
podaje bezwzględny adres URL ze ścieżki. Helper asset()
podaje ścieżkę zasobu.
{{ app.request.uriForPath(asset('bundles/mybundle/images/name.png')) }}
Ważne jest, aby mieć oba w przypadku, gdy aplikacja nie jest w korzeniu domeny, na przykład:
http://mydomain.com/myapp/app.php
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-28 17:32:40
To rozwiązanie nie wymaga dodawania żadnej zmiennej lub parametru w config i jest tą samą funkcją, która jest używana przez Twig dla {{ absolute_url() }}
public function yourAction(AssetsHelper $assetsHelper, HttpFoundationExtension $httpExtension)
{
$assetsPath = $assetsHelper->getUrl('/img/test.jpg');
$assetFullUrl = $httpExtension->generateAbsoluteUrl($assetPath);
}
Pełny adres url Twojego zasobu będzie na $assetFullUrl
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-17 10:16:49
Rozwiązanie @Al Jey działa dobrze z Assetic (testowane na Symfony 2.6)
{% image '@AcmeBundle/Resources/public/images/myimage.jpg' %}
<img src="{{ app.request.uriForPath(asset_url) }}">
{% endimage %}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-13 09:07:19
Rozwiązanie robocze w Symfony 3.3 +
# app/config/config.yml
parameters:
...
base_url: 'http://mywebsite.com'
Aby uzyskać go w akcji kontrolera:
$baseUrl = $this->getParameter('base_url');
Możesz teraz dołączyć do niego swój obrazek np: $baseUrl . '/uploads/' . $image
lub jeśli chcesz, możesz zdefiniować w config bazowy adres URL przesłanych zasobów.yml i uzyskać do niego dostęp w akcji kontrolera.
Najlepszą rzeczą w tym rozwiązaniu byłaby możliwość wstępnego zdefiniowania go dla różnych środowisk np: w config.yml
, config_dev.yml
i config_test.yml
więc kiedy przenosisz swój projekt między różnymi środowiskami, nie musisz go zmieniać jako już tam jest..
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-27 09:41:31
Dla gałązki to też powinno działać (prościej):
{{ url(asset('...')) }}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-02 23:54:32
Możesz uzyskać adres URL witryny tj. wskazać folder www, używając następującego kodu
$ protokół = 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;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-14 21:26:51