Ich mache den Wechsel von CodeIgniter zu Symfony 2. Kann mir jemand ein Beispiel geben,
Warum brauchen Sie diese Root-URL? Können Sie nicht direkt absolute URLs generieren?
{{ url('_demo_hello', { 'name': 'Thomas' }) }}
Dieser Twig-Code generiert den vollständigen http: // url für die _demo_hello-Route.
Tatsächlich erhält die Basis-URL der Website nur die vollständige URL der Homepage-Route:
{{ url('homepage') }}
( homepage oder wie immer Sie es in Ihrer Routing-Datei nennen).
Dies ist jetzt kostenlos in Zweigvorlagen verfügbar (getestet mit SF2-Version 2.0.14).
{{ app.request.getBaseURL() }}
Versuchen Sie es in späteren Symfony-Versionen (getestet mit Version 2.5):
{{ app.request.getSchemeAndHttpHost() }}
Sie können die neue Anforderungsmethode getSchemeAndHttpHost()
verwenden:
{{ app.request.getSchemeAndHttpHost() }}
Die Basis-URL ist in Symfony\Component\Routing\RequestContext
definiert.
Es kann wie folgt vom Controller abgerufen werden:
$this->container->get('router')->getContext()->getBaseUrl()
Gültig von Symfony v2.1 bis v4.1 +
Wenn Sie möchten, dass die Basis-URL zu einer Symfony-Anwendung gehört, sollten Sie getSchemeAndHttpHost()
zusammen mit getBaseUrl()
verketten, ähnlich wie getUri()
, verwenden, es sei denn, der Router-Pfad und die Abfragezeichenfolge.
{{ app.request.schemeAndHttpHost ~ app.request.baseUrl }}
Wenn sich die URL Ihrer Symfony-Website beispielsweise unter https://www.stackoverflow.com/app1/
befindet, geben diese beiden Methoden diese Werte zurück:
getSchemeAndHttpHost
https://www.stackoverflow.com
getBaseUrl
/app1
Hinweis: getBaseUrl()
enthält den Dateinamen des Skripts (dh /app.php
), wenn er sich in Ihrer URL befindet.
Für Symfony 2.3+ sollte es die Basis-URL in einem Controller sein
$this->get('request')->getSchemeAndHttpHost();
<base href="{{ app.request.getSchemeAndHttpHost() }}"/>
oder vom Controller
$this->container->get('router')->getContext()->getSchemeAndHttpHost()
Auch für js/css/image URLs gibt es eine praktische Funktion asset ().
<img src="{{ asset('image/logo.png') }}"/>
Anstatt die Variable global an die Vorlage zu übergeben, können Sie eine Basisvorlage definieren und den 'globalen Teil' darin rendern. Die Basisvorlage kann vererbt werden.
Beispiel für eine Rendering-Vorlage Aus der symfony-Dokumentation:
<div id="sidebar">
{% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %}
</div>
Bei der aktuellen Symfony-Version (zum Zeitpunkt des Schreibens dieser Antwort ist es Symfony 4.1), greifen Sie nicht direkt auf den Dienstcontainer wie in einigen anderen Antworten zu.
Fügen Sie das Anforderungsobjekt stattdessen (wenn Sie nicht die Standard-Servicekonfiguration verwenden) durch Typhinweise ein.
<?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;
}
}
Siehe auch offizielle Symfony-Dokumente zu zum Abrufen des aktuellen Anforderungsobjekts .
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
In einer Situation mit einer Anwendung für mehrere Domänen hat mir app.request.getHttpHost
geholfen. Es gibt so etwas wie example.com
oder subdomain.example.com
zurück (oder example.com:8000
, wenn der Port nicht Standard ist). Dies war in Symfony 3.4.