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.
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():
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.
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.
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>
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.
<?phpnamespaceApp\Service;
useSymfony\Component\HttpFoundation\RequestStack;
/**
* The YourService class provides a method for retrieving the base URL.
*
* @package App\Service
*/classYourService{
/**
* @var string
*/protected $baseUrl;
/**
* YourService constructor.
*
* @param \Symfony\Component\HttpFoundation\RequestStack $requestStack
*/publicfunction__construct(RequestStack $requestStack)
{
$this->baseUrl = $requestStack->getCurrentRequest()->getSchemeAndHttpHost();
}
/**
* Returns the current base URL.
*
* @return string
*/publicfunctiongetBaseUrl(): string{
return$this->baseUrl;
}
}
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.
Odpowiedzi:
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).
źródło
To jest teraz dostępne za darmo w szablonach gałązek (testowane na sf2 w wersji 2.0.14)
W późniejszych wersjach Symfony (testowanych na 2.5) spróbuj:
źródło
{{ app.request.baseUrl }}
(zlokalizuje metodę pobierającą i wywoła ją automatycznie){{ app.request.getSchemeAndHttpHost() }}
działa!Możesz użyć nowej metody żądania
getSchemeAndHttpHost()
:źródło
Ważne od Symfony v2.1 do v4.1 +
Jeśli chcesz, aby podstawowy adres URL do aplikacji Symfony był używany
getSchemeAndHttpHost()
razem zgetBaseUrl()
, powinieneś użyć razem z , podobnie jakgetUri()
działa, z wyjątkiem braku ścieżki routera i ciągu zapytania.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
Uwaga:
getBaseUrl()
zawiera nazwę pliku skryptu (tj./app.php
), Jeśli znajduje się w adresie URL.źródło
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()
źródło
Dla Symfony 2.3+, aby uzyskać podstawowy adres URL w kontrolerze, powinno być
$this->get('request')->getSchemeAndHttpHost();
źródło
$this->container->get('request')->getSchemeAndHttpHost()
<base href="{{ app.request.getSchemeAndHttpHost() }}"/>
lub od kontrolera
$this->container->get('router')->getContext()->getSchemeAndHttpHost()
źródło
Również dla adresów URL js / css / image jest przydatna funkcja asset ()
<img src="{{ asset('image/logo.png') }}"/>
źródło
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>
źródło
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 .
źródło
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
źródło
app.request.getHttpHost
Pomogło mi to w jednej sytuacji związanej z aplikacją wielodomenową . Zwraca coś w rodzajuexample.com
lubsubdomain.example.com
(lubexample.com:8000
gdy port nie jest standardowy). Było to w Symfony 3.4.źródło
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); }
źródło
Wypróbowałem wszystkie opcje tutaj, ale nie działały dla mnie. W końcu zacząłem go używać
Mam nadzieję, że pomoże to komuś, kto wciąż walczy.
źródło
site
zawiera?