Web sitesinin temel url'sini alma ve global olarak Symfony 2'de twig'e aktarma


Yanıtlar:


91

Bu kök url'yi neden almanız gerekiyor? Doğrudan mutlak URL'ler üretemez misiniz?

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

Bu Twig kodu, _demo_hello yolunun tam http: // url'sini oluşturacaktır.

Aslında, web sitesinin temel URL'sini almak, yalnızca ana sayfa yolunun tam URL'sini almaktır:

{{ url('homepage') }}

( ana sayfa veya yönlendirme dosyanızda adı ne olursa olsun).


Çok teşekkürler, gidilecek yolun bu olduğunu düşündüm ama sadece {{yol (..)}} işlevini biliyordum, bu da yanlış sonuçlara yol açıyordu. {{url}} tam da ihtiyacım olan şey.
Geoffrey De Vylder

ne olursa olsun twig'i symfony konsol komutundan işliyorsam, diyelim ki e-posta şablonu oluşturmak için temel URL'ye ihtiyacım var. Bu durumda nasıl yaparım.
vishal


Twig kullanmıyorsam , bunu PHP'de nasıl yeniden yazabilirim ?
Nis

1
Çalışmıyor Önemli hata: Yakalanmamış Twig_Error_Syntax: J: \ xampp \ htdocs \ sites \ opencart3020 \ system \ library \ template \ Twig \ "default / template / extension / module / feature.twig" satırında bilinmeyen "url" işlevi ExpressionParser.php: 574 Yığın izleme: # 0
Kamlesh

143

Bu artık twig şablonlarında ücretsiz olarak mevcuttur (sf2 sürüm 2.0.14'te test edilmiştir)

{{ app.request.getBaseURL() }}

Daha sonraki Symfony sürümlerinde (2.5'te test edilmiştir) şunları deneyin:

{{ app.request.getSchemeAndHttpHost() }}

36
Hatta kısaltılabilir {{ app.request.baseUrl }}(alıcı yöntemini bulur ve otomatik olarak çağırır)
Colin O'Dell

2
@Colin O'Dell ayrıca, görünümdeki yöntem çağrılarını KULLANMAMAK daha da önemlidir - görünüm nesnede hangi yöntemlerin olduğunu bilmemelidir. Symfony'de biraz farklı görünse de, yine de bu cevap için +10.
thorinkor

1
Twig kullanmıyorsam , bunu PHP'de nasıl yeniden yazabilirim ?
Nis

6
Bu, sonraki sürümlerde çalışmaz (sf 2.5'te test edilmiştir). Aşağıdaki cevap {{ app.request.getSchemeAndHttpHost() }}işe yarıyor!
RayOnAir

55

Yeni istek yöntemini kullanabilirsiniz getSchemeAndHttpHost():

{{ app.request.getSchemeAndHttpHost() }}

1
Bu işlev Symfony 2.1
Bobin

37

Symfony v2.1 ile v4.1 + arasında geçerlidir

Temel URL'yi bir Symfony uygulaması için istiyorsanız , yönlendirici yolu ve sorgu dizesi dışında, nasıl çalıştığına benzer şekilde, getSchemeAndHttpHost()ile birlikte birleştirmeyi kullanmalısınız .getBaseUrl()getUri()

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

Örneğin, Symfony web sitesi URL'niz konumunda bulunuyorsa https://www.stackoverflow.com/app1/, bu iki yöntem şu değerleri döndürür:

getSchemeAndHttpHost

https://www.stackoverflow.com

getBaseUrl

/app1

Not: URL'nizdeyse getBaseUrl()komut dosyası dosya adını (yani /app.php) içerir .


34

Temel url içeride tanımlanmıştır Symfony\Component\Routing\RequestContext.

Denetleyiciden şu şekilde getirilebilir:

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

17

Symfony 2.3+ için, bir denetleyicide temel url'yi almak için

$this->get('request')->getSchemeAndHttpHost();

$this->container->get('request')->getSchemeAndHttpHost()
Alex Quintero

16
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

veya denetleyiciden

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

4

Ayrıca js / css / resim url'leri için kullanışlı işlev varlığı () var

<img src="{{ asset('image/logo.png') }}"/>

2
Lütfen cevabınıza biraz daha açıklama ekleyin - sonuçta varlık baseUrl'yi kullanıyor mu? Projelerimde, sadece göreli bir URL yazdırıyor
Nico Haase

2

Değişkeni global olarak şablona geçirmek yerine, bir temel şablon tanımlayabilir ve içindeki 'global kısmı' oluşturabilirsiniz. Temel şablon miras alınabilir.

Şablon oluşturma örneği Symfony Belgelerinden:

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

2

Mevcut Symfony sürümü için (bu cevabı yazarken, Symfony 4.1), diğer cevapların bazılarında olduğu gibi servis konteynerine doğrudan erişmeyin.

Bunun yerine (standart servis yapılandırmasını kullanmadığınız sürece), istek nesnesini tip ipucu ile enjekte edin.

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

Ayrıca geçerli istek nesnesinin nasıl alınacağıyla ilgili resmi Symfony belgelerine bakın .



0

Çok alanlı bir uygulama içeren bir durumda app.request.getHttpHostbana yardımcı oldu. example.comVeya gibi bir şey döndürür subdomain.example.com(veya example.com:8000bağlantı noktası standart olmadığında). Bu Symfony 3.4'teydi.


0

Symfony 5'te ve bir denetleyici yönteminin genel durumunda, enjekte edilen Request nesnesini kullanın :

public function controllerFunction(Request $request, LoggerInterface $logger)
  ...
  $scheme = $request->getSchemeAndHttpHost();
  $logger->info('Domain is: ' . $scheme);
  ...
  //prepare to render
  $retarray = array(
    ...
    'scheme' => $scheme,
    ...
    );
  return $this->render('Template.html.twig', $retarray);
}

-1

Buradaki tüm seçenekleri denedim ama benim için işe yaramadı. Sonunda kullanarak çalıştırdım

{{ Site URL'si }}

Umarım bu hala mücadele eden birine yardımcı olur.


Bu nereden geliyor? Ne siteiçerir?
Nico Haase

Bu Timber ve Wordpress'ten.
Konstantinos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.