Как получить полный URL для актива в контроллере?

StackOverflow https://stackoverflow.com/questions/8811251

  •  26-10-2019
  •  | 
  •  

Вопрос

Мне нужно генерировать некоторый контент JSON в контроллере, и мне нужно получить полный URL -адрес на загруженное изображение, расположенное здесь: /web/uploads/myimage.jpg.

Как я могу получить полный URL?

http://www.mywebsite.com/uploads/myimage.jpg

Это было полезно?

Решение

Вы можете сгенерировать URL из объекта запроса:

$baseurl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath();

Вы можете сделать расширение веток, которое разрезает /web Часть вашего пути и использует запрос для создания базового URL.

видеть Symfony\Component\Routing\Generator\UrlGenerator::doGenerate для более прочной реализации.

Кроме того, Twig имеет доступ к запросу из app.request.

Другие советы

Вы можете использовать это в контроллере:

$this->getRequest()->getUriForPath('/uploads/myimage.jpg');

РЕДАКТИРОВАТЬ : Этот метод также включает app.php а также app_dev.php к URL. Значение Это будет работать только в производстве только после включения URL-rewriting!

Вы можете использовать templating.helper.assets оказание услуг.

Сначала определите свой Активы базовый URL :

# app/config/config.yml
framework:
    templating:
        assets_base_url: "http://www.mywebsite.com/"

Затем просто позвоните в службу изнутри вашего контроллера, команды или где бы вы ни находились:

<?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();
    }
}

Если вы хотите получить этот URL -адрес из -за использования шаблона ветки:

{{ app.request.uriForPath('/uploads/myimage.jpg') }}

Как Symfony 2.1 вы можете использовать:

$request->getSchemeAndHttpHost(). '/uploads/myimage.jpg';

Примечание: Это решение имеет преимущество для работы в оба Dev и Prod среда.

Лучшим решением будет IMHO, чтобы посмотреть TwigВнедрение asset, что вы можете найти в:

\Symfony\Bundle\TwigBundle\Extension\AssetsExtension

В методе:

public function getAssetUrl($path, $packageName = null, $absolute = false, $version = null)

который в основном использует templating.helper.assets Сервис, похожий на ответ @iamdto:

$url = $this->container->get('templating.helper.assets')->getUrl($path, $packageName, $version);

Или напрямую использовать AssetsExtension сервис или класс соответственно.

app.request.uriForPath('/uploads/myimage.jpg') | replace({'/app_dev.php': ''})

Это избегает проблемы app_dev.php

Это решение не требует добавления какой -либо переменной или параметра в конфигурации и является той же функцией, которая используется Twig для {{ absolute_url() }}

public function yourAction(AssetsHelper $assetsHelper, HttpFoundationExtension $httpExtension)
{
    $assetsPath = $assetsHelper->getUrl('/img/test.jpg');
    $assetFullUrl = $httpExtension->generateAbsoluteUrl($assetPath);
}

Полный URL вашего актива будет включен $assetFullUrl

Этот работает для меня

$baseurl = $this->getRequest()->getScheme() . '://' . $this->getRequest()->getHttpHost() . $this->getRequest()->getBasePath();

Метод app.request.uriForPath() дает абсолютный URL с пути. Вспомогательный asset() дает путь актива.

{{ app.request.uriForPath(asset('bundles/mybundle/images/name.png')) }}

Важно иметь оба для случая, когда приложение не лежит в основе домена, например:

http://mydomain.com/myapp/app.php

Решение @Al Jey прекрасно работает с достоинством (протестировано на Symfony 2.6)

{% image '@AcmeBundle/Resources/public/images/myimage.jpg' %} 
    <img src="{{ app.request.uriForPath(asset_url) }}"> 
{% endimage %}

Рабокое решение в Symfony 3.3+

# app/config/config.yml
parameters:
    ...
    base_url: 'http://mywebsite.com'

Чтобы получить его в действии контроллера:

$baseUrl = $this->getParameter('base_url');

Теперь вы можете добавить свое изображение к нему, например: $baseUrl . '/uploads/' . $image Или, если вам нравится, вы можете определить загруженные активы базовый URL в config.yml и получить доступ к нему в действии контроллера.

Лучшая вещь в этом решении-возможность предварительно определять его для разных сред, например: в config.yml, config_dev.yml а также config_test.yml Поэтому, когда вы перемещаете свой проект между различными средами, вам не нужно менять его, поскольку он уже там.

Ваше здоровье!

Для CDN вы также можете ввести Packages непосредственно в ваш сервис.

Сначала URL -адрес базы активов в config.yml:

framework:
    assets:
        base_url:
            - 'http://cdn.mysite.com'

Тогда самое интересное:

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);
    }
}

Если у вас есть автоматическое использование, вам не нужно ничего настроить в своем services.yml, в противном случае что -то вроде:

services:
    App\Service\SomeClass:
        class: App\Service\SomeClass
        arguments: ['@assets.packages']

Вы можете использовать функцию getschemeandhttphost () Для получения схемы и HTTP -хоста и используйте функцию getbasepath () Чтобы получить корневой путь, из которого выполняется этот запрос

$request->getSchemeAndHttpHost().$request->getBasePath()."/uploads/myimage.jpg"

Этот метод отлично работает для app.php и app_dev.php.

Вы можете получить URL -адрес сайта, т.е. в веб -папку, используя следующий код

$ 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top