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

Author: i.am.michiel, 0000-00-00

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.

 48
Author: solarc,
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 !

 35
Author: smatyas,
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();
    }
}
 26
Author: iamdto,
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') }}
 15
Author: Eugene Kuzmenko,
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.

 8
Author: stryba,
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.

 7
Author: COil,
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

 4
Author: Ignacio,
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();
 2
Author: debianek,
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
 2
Author: Quentin,
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

 2
Author: Rui Cardoso,
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 %}
 1
Author: ke20,
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..

Zdrówko!
 0
Author: Muzafar Ali,
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('...')) }}
 0
Author: DiceXQ,
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;
 -1
Author: Ashok,
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