Obtendo a url base do site e passando-a globalmente para o twig no Symfony 2

Respostas:

92

Por que você precisa obter este URL de raiz? Você não pode gerar URLs absolutos diretamente?

{{ url('_demo_hello', { 'name': 'Thomas' }) }}

Este código Twig irá gerar o http: // url completo para a rota _demo_hello.

Na verdade, obter o URL base do site é apenas obter o URL completo da rota da página inicial:

{{ url('homepage') }}

( página inicial , ou o que quer que você chame em seu arquivo de roteamento).

Damien
fonte
Muito obrigado, pensei que esse era o caminho a percorrer, mas eu só sabia sobre a função {{path (..)}}, levando a resultados errados. {{url}} é exatamente o que eu precisava.
Geoffrey De Vylder
no caso de eu estar renderizando o twig do comando do console do symfony, digamos para gerar o modelo de e-mail, preciso do URL base. Como faço nesse caso.
vishal
1
Existe um livro de receitas para isso: symfony.com/doc/master/cookbook/console/sending_emails.html
Damien
Se eu não estiver usando o twig , como posso reescrever isso no PHP ?
Nis
1
Não funciona Erro fatal: Twig_Error_Syntax não detectado: Função "url" desconhecida em "default / template / extension / module / featured.twig" na linha 5. em J: \ xampp \ htdocs \ sites \ opencart3020 \ system \ library \ template \ Twig \ ExpressionParser.php: 574 Stack trace: # 0
Kamlesh
143

Isso agora está disponível gratuitamente em modelos de galhos (testado em sf2 versão 2.0.14)

{{ app.request.getBaseURL() }}

Em versões posteriores do Symfony (testado em 2.5), tente:

{{ app.request.getSchemeAndHttpHost() }}
codecowboy
fonte
36
Isso pode até ser reduzido para {{ app.request.baseUrl }}(localizará o método getter e o chamará automaticamente)
Colin O'Dell
2
Além disso, @Colin O'Dell é ainda mais apropriado NÃO USAR as chamadas de método em vista - a visão não deve saber quais métodos estão no objeto. Embora pareça um pouco diferente no symfony, mas +10 para essa resposta de qualquer maneira.
Thorinkor
1
Se eu não estiver usando o twig , como posso reescrever isso no PHP ?
Nis
6
Isso NÃO funciona em versões posteriores (testado em sf 2.5). A resposta abaixo {{ app.request.getSchemeAndHttpHost() }}funciona!
RayOnAir
55

Você pode usar o novo método de solicitação getSchemeAndHttpHost():

{{ app.request.getSchemeAndHttpHost() }}
Hugo Nogueira
fonte
1
Esta função foi introduzida no Symfony 2.1
COil 02 de
35

Válido do Symfony v2.1 até v4.1 +

Se você quiser a URL base para um aplicativo Symfony, você deve usar getSchemeAndHttpHost()concatenado junto com getBaseUrl(), semelhante a como getUri()funciona, exceto sem o caminho do roteador e a string de consulta.

{{ app.request.schemeAndHttpHost ~ app.request.baseUrl }}

Por exemplo, se o URL do seu site Symfony residir em https://www.stackoverflow.com/app1/, esses dois métodos retornam estes valores:

getSchemeAndHttpHost

https://www.stackoverflow.com

getBaseUrl

/app1

Nota: getBaseUrl()inclui o nome do arquivo do script (ou seja, /app.phpse estiver no seu URL).

Matt Janssen
fonte
34

O URL base é definido internamente Symfony\Component\Routing\RequestContext.

Ele pode ser obtido do controlador desta forma:

$this->container->get('router')->getContext()->getBaseUrl()
Sumanchalki
fonte
17

Para Symfony 2.3+, para obter a url base em um controlador deve ser

$this->get('request')->getSchemeAndHttpHost();
Sr. 14
fonte
$this->container->get('request')->getSchemeAndHttpHost()
Alex Quintero
16
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

ou do controlador

$this->container->get('router')->getContext()->getSchemeAndHttpHost()
user3869574
fonte
3

Também para js / css / urls de imagem, há uma função útil asset ()

<img src="{{ asset('image/logo.png') }}"/>
Faixa
fonte
2
Adicione mais explicações à sua resposta - o asset usa o baseUrl afinal? Em meus projetos, ele apenas imprime um URL relativo
Nico Haase
2

Em vez de passar a variável para o modelo globalmente, você pode definir um modelo base e renderizar a 'parte global' nele. O modelo básico pode ser herdado.

Exemplo de modelo de renderização da documentação do symfony:

<div id="sidebar">
  {% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %}
</div>
Sethunath
fonte
2

Para a versão atual do Symfony (quando escrevi esta resposta, é Symfony 4.1) não acesse diretamente o contêiner de serviço como feito em algumas das outras respostas.

Em vez disso (a menos que você não use a configuração de serviços padrão), injete o objeto de solicitação por sugestão de tipo.

<?php

namespace App\Service;

use Symfony\Component\HttpFoundation\RequestStack;

/**
 * The YourService class provides a method for retrieving the base URL.
 *
 * @package App\Service
 */
class YourService
{

    /**
     * @var string
     */
    protected $baseUrl;

    /**
     * YourService constructor.
     *
     * @param \Symfony\Component\HttpFoundation\RequestStack $requestStack
     */
    public function __construct(RequestStack $requestStack)
    {
        $this->baseUrl = $requestStack->getCurrentRequest()->getSchemeAndHttpHost();
    }

    /**
     * Returns the current base URL.
     *
     * @return string
     */
    public function getBaseUrl(): string
    {
        return $this->baseUrl;
    }
}

Veja também a documentação oficial do Symfony sobre como recuperar o objeto de solicitação atual .

Arvid
fonte
0
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
Ivan Proskuryakov
fonte
0

Em uma situação envolvendo um aplicativo multi-domínio, app.request.getHttpHostme ajudou. Ele retorna algo como example.comou subdomain.example.com(ou example.com:8000quando a porta não é padrão). Isso estava no Symfony 3.4.

ACJ
fonte
-1

Eu tentei todas as opções aqui, mas elas não funcionaram para mim. Acabei fazendo funcionar usando

{{ URL do site }}

Espero que isso ajude alguém que ainda está lutando.

user12531260
fonte
De onde vem isto? O que sitecontém?
Nico Haase
Isso é da Timber e do Wordpress.
Konstantinos