Как получить полный URL для актива в контроллере? - PullRequest
46 голосов
/ 11 января 2012

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

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

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

Ответы [ 14 ]

50 голосов
/ 11 января 2012

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

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

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

см. Symfony\Component\Routing\Generator\UrlGenerator::doGenerate для более надежной реализации.

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

38 голосов
/ 27 сентября 2012

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

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

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

28 голосов
/ 11 мая 2013

Вы можете использовать службу 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();
    }
}
15 голосов
/ 14 июня 2012

Если вы хотите получить этот URL из шаблона ветки, используйте:

{{ app.request.uriForPath('/uploads/myimage.jpg') }}
10 голосов
/ 24 ноября 2015

Начиная с Symfony 2.1 вы можете использовать:

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

Примечание : Преимущество этого решения в обоих DEVи среды PROD.

8 голосов
/ 14 октября 2014

Лучшим решением было бы ИМХО взглянуть на реализацию 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 соответственно.

4 голосов
/ 26 сентября 2013
app.request.uriForPath('/uploads/myimage.jpg') | replace({'/app_dev.php': ''})

это позволяет избежать проблемы app_dev.php

3 голосов
/ 17 января 2018

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

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

Полный URL вашего ресурса будет на $assetFullUrl

2 голосов
/ 28 октября 2013

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

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

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

http://mydomain.com/myapp/app.php
2 голосов
/ 13 мая 2013

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

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