Uzyskanie podstawowego adresu URL witryny i globalne przekazanie go do twig w Symfony 2

92

Przechodzę z CodeIgniter na Symfony 2. Czy ktoś może mi podać przykład, jak:

  • Uzyskaj podstawowy adres URL (adres URL bez części specyficznych dla trasy)
  • Przekaż tę zmienną globalnie do pakietu gałązek, abym mógł jej użyć w każdym szablonie.
Geoffrey De Vylder
źródło

Odpowiedzi:

91

Dlaczego potrzebujesz tego głównego adresu URL? Nie możesz wygenerować bezpośrednio bezwzględnych adresów URL?

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

Ten kod Twig wygeneruje pełny adres http: // adres URL do trasy _demo_hello.

W rzeczywistości uzyskanie podstawowego adresu URL witryny oznacza tylko uzyskanie pełnego adresu URL trasy do strony głównej:

{{ url('homepage') }}

( strona główna lub jakkolwiek nazwiesz ją w swoim pliku routingu).

Damien
źródło
Wielkie dzięki, myślałem, że to dobra droga, ale wiedziałem tylko o funkcji {{path (..)}}, co prowadzi do błędnych wyników. {{url}} jest właśnie tym, czego potrzebowałem.
Geoffrey De Vylder
co w przypadku, gdy renderuję gałązkę z polecenia konsoli symfony, powiedzmy, aby wygenerować szablon wiadomości e-mail, potrzebuję podstawowego adresu URL. Jak mam to zrobić w takim przypadku.
vishal
1
Jest do tego książka kucharska: symfony.com/doc/master/cookbook/console/sending_emails.html
Damien
Jeśli nie używam twig, jak mogę przepisać to w PHP ?
Nis
1
Nie działa Błąd krytyczny: Uncaught Twig_Error_Syntax: Nieznana funkcja „url” w „default / template / extension / module / featured.twig” w wierszu 5. w J: \ xampp \ htdocs \ sites \ opencart3020 \ system \ library \ template \ Twig \ ExpressionParser.php: 574 Śledzenie stosu: # 0
Kamlesh
143

To jest teraz dostępne za darmo w szablonach gałązek (testowane na sf2 w wersji 2.0.14)

{{ app.request.getBaseURL() }}

W późniejszych wersjach Symfony (testowanych na 2.5) spróbuj:

{{ app.request.getSchemeAndHttpHost() }}
codecowboy
źródło
36
Można to nawet skrócić do {{ app.request.baseUrl }}(zlokalizuje metodę pobierającą i wywoła ją automatycznie)
Colin O'Dell,
2
@Colin O'Dell Co więcej, jeszcze bardziej właściwe jest NIE UŻYWAĆ wywołań metod w widoku - widok nie powinien wiedzieć, jakie metody znajdują się w obiekcie. Chociaż wygląda to nieco inaczej w symfony, ale i tak +10 dla tej odpowiedzi.
thorinkor
1
Jeśli nie używam twig, jak mogę przepisać to w PHP ?
Nis
6
NIE działa to w późniejszych wersjach (testowane na sf 2.5). Poniższa odpowiedź {{ app.request.getSchemeAndHttpHost() }}działa!
RayOnAir
55

Możesz użyć nowej metody żądania getSchemeAndHttpHost():

{{ app.request.getSchemeAndHttpHost() }}
Hugo Nogueira
źródło
1
Ta funkcja została wprowadzona w Symfony 2.1
COil
37

Ważne od Symfony v2.1 do v4.1 +

Jeśli chcesz, aby podstawowy adres URL do aplikacji Symfony był używany getSchemeAndHttpHost()razem z getBaseUrl(), powinieneś użyć razem z , podobnie jak getUri()działa, z wyjątkiem braku ścieżki routera i ciągu zapytania.

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

Na przykład, jeśli adres URL Twojej witryny Symfony znajduje się pod adresem https://www.stackoverflow.com/app1/, te dwie metody zwracają następujące wartości:

getSchemeAndHttpHost

https://www.stackoverflow.com

getBaseUrl

/app1

Uwaga: getBaseUrl()zawiera nazwę pliku skryptu (tj. /app.php), Jeśli znajduje się w adresie URL.

Matt Janssen
źródło
34

Podstawowy adres URL jest zdefiniowany wewnątrz Symfony\Component\Routing\RequestContext.

Można go pobrać z kontrolera w następujący sposób:

$this->container->get('router')->getContext()->getBaseUrl()
sumanchalki
źródło
17

Dla Symfony 2.3+, aby uzyskać podstawowy adres URL w kontrolerze, powinno być

$this->get('request')->getSchemeAndHttpHost();
Pan 14
źródło
$this->container->get('request')->getSchemeAndHttpHost()
Alex Quintero,
16
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

lub od kontrolera

$this->container->get('router')->getContext()->getSchemeAndHttpHost()
user3869574
źródło
4

Również dla adresów URL js / css / image jest przydatna funkcja asset ()

<img src="{{ asset('image/logo.png') }}"/>
Szarfa
źródło
2
Dodaj więcej wyjaśnień do swojej odpowiedzi - czy w końcu zasób używa baseUrl? W moich projektach po prostu drukuje względny adres URL
Nico Haase,
2

Zamiast globalnego przekazywania zmiennej do szablonu, możesz zdefiniować szablon bazowy i wyrenderować w nim „część globalną”. Szablon podstawowy można odziedziczyć.

Przykład renderowania szablonu Z dokumentacji symfony:

<div id="sidebar">
  {% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %}
</div>
Sethunath
źródło
2

W obecnej wersji Symfony (w chwili pisania tej odpowiedzi jest to Symfony 4.1) nie uzyskuj bezpośredniego dostępu do kontenera usług, jak to zrobiono w niektórych innych odpowiedziach.

Zamiast tego (chyba że nie używasz standardowej konfiguracji usług), wstrzyknij obiekt żądania za pomocą podpowiedzi do typu.

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

Zobacz także oficjalne dokumenty Symfony o tym, jak pobrać aktualny obiekt żądania .

Arvid
źródło
0
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
Ivan Proskuryakov
źródło
0

app.request.getHttpHostPomogło mi to w jednej sytuacji związanej z aplikacją wielodomenową . Zwraca coś w rodzaju example.comlub subdomain.example.com(lub example.com:8000gdy port nie jest standardowy). Było to w Symfony 3.4.

ACJ
źródło
0

W Symfony 5 iw typowej sytuacji metody kontrolera użyj wstrzykniętego obiektu Request :

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);
}
Vladtn
źródło
-1

Wypróbowałem wszystkie opcje tutaj, ale nie działały dla mnie. W końcu zacząłem go używać

{{ Strona URL }}

Mam nadzieję, że pomoże to komuś, kto wciąż walczy.

user12531260
źródło
Skąd to pochodzi? Co sitezawiera?
Nico Haase
To z Timber i Wordpress.
Konstantinos