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.
Przechodzę z CodeIgniter na Symfony 2. Czy ktoś może mi podać przykład, jak:
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).
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() }}
{{ 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()
:
{{ app.request.getSchemeAndHttpHost() }}
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.
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()
Dla Symfony 2.3+, aby uzyskać podstawowy adres URL w kontrolerze, powinno być
$this->get('request')->getSchemeAndHttpHost();
$this->container->get('request')->getSchemeAndHttpHost()
<base href="{{ app.request.getSchemeAndHttpHost() }}"/>
lub od kontrolera
$this->container->get('router')->getContext()->getSchemeAndHttpHost()
Również dla adresów URL js / css / image jest przydatna funkcja asset ()
<img src="{{ asset('image/logo.png') }}"/>
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.
<?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 .
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
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);
}
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.
site
zawiera?