Abrufen der Basis-URL der Website und globale Weitergabe an twig in Symfony 2

Antworten:

92

Warum benötigen Sie diese Root-URL? Können Sie keine direkten absoluten URLs generieren?

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

Dieser Twig-Code generiert die vollständige http: // URL zur _demo_hello-Route.

Wenn Sie die Basis-URL der Website abrufen, erhalten Sie nur die vollständige URL der Homepage-Route:

{{ url('homepage') }}

( Homepage oder wie auch immer Sie es in Ihrer Routing-Datei nennen).

Damien
quelle
Vielen Dank, ich dachte, dies wäre der richtige Weg, aber ich wusste nur über die Funktion {{path (..)}} Bescheid, was zu falschen Ergebnissen führte. {{url}} ist genau das, was ich brauchte.
Geoffrey De Vylder
Was für den Fall, dass ich den Zweig aus dem Symfony-Konsolenbefehl rendere, sagen wir, um eine E-Mail-Vorlage zu generieren, brauche ich eine Basis-URL. Wie mache ich das in diesem Fall?
Vishal
1
Es gibt ein Kochbuch dafür: symfony.com/doc/master/cookbook/console/sending_emails.html
Damien
Wenn ich keinen Zweig verwende, wie kann ich dies dann in PHP umschreiben ?
Ni
1
Funktioniert nicht: Schwerwiegender Fehler: Nicht erfasste Twig_Error_Syntax: Unbekannte "URL" -Funktion in "Standard / Vorlage / Erweiterung / Modul / Featured.twig" in Zeile 5. In J: \ xampp \ htdocs \ sites \ opencart3020 \ system \ library \ template \ Twig \ ExpressionParser.php: 574
Stapelverfolgung
142

Dies ist jetzt kostenlos in Zweigvorlagen verfügbar (getestet auf sf2 Version 2.0.14).

{{ app.request.getBaseURL() }}

Versuchen Sie in späteren Symfony-Versionen (getestet auf 2.5):

{{ app.request.getSchemeAndHttpHost() }}
Codecowboy
quelle
36
Dies kann sogar verkürzt werden {{ app.request.baseUrl }}(es wird die Getter-Methode lokalisieren und diese automatisch aufrufen)
Colin O'Dell
2
@Colin O'Dell außerdem ist es noch angemessener, die Methodenaufrufe in der Ansicht NICHT zu verwenden - die Ansicht sollte nicht wissen, welche Methoden sich im Objekt befinden. Zwar sieht es in der Symfonie etwas anders aus, aber +10 für diese Antwort trotzdem.
Thorinkor
1
Wenn ich keinen Zweig verwende, wie kann ich dies dann in PHP umschreiben ?
Ni
6
Dies funktioniert NICHT in späteren Versionen (getestet auf sf 2.5). Die folgende Antwort {{ app.request.getSchemeAndHttpHost() }}funktioniert!
RayOnAir
55

Sie können die neue Anforderungsmethode verwenden getSchemeAndHttpHost():

{{ app.request.getSchemeAndHttpHost() }}
Hugo Nogueira
quelle
1
Diese Funktion wurde in Symfony 2.1
COil
34

Die Basis-URL ist im Inneren definiert Symfony\Component\Routing\RequestContext .

Es kann wie folgt vom Controller abgerufen werden:

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

Gültig von Symfony v2.1 bis v4.1 +

Wenn Sie die Basis-URL zu einer Symfony-Anwendung verwenden möchten, sollten Sie getSchemeAndHttpHost()verkettet zusammen mit verwenden getBaseUrl(), ähnlich wie dies getUri()funktioniert, außer ohne den Routerpfad und die Abfragezeichenfolge.

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

Wenn beispielsweise Ihre Symfony-Website-URL unter lautet https://www.stackoverflow.com/app1/, geben diese beiden Methoden die folgenden Werte zurück:

getSchemeAndHttpHost

https://www.stackoverflow.com

getBaseUrl

/app1

Hinweis: getBaseUrl()Enthält den Skriptdateinamen (dh /app.php), falls er in Ihrer URL enthalten ist.

Matt Janssen
quelle
Das war super hilfreich, danke.
Grafik
17

Für Symfony 2.3+ sollte es sein, die Basis-URL in einem Controller zu erhalten

$this->get('request')->getSchemeAndHttpHost();
Herr 14
quelle
$this->container->get('request')->getSchemeAndHttpHost()
Alex Quintero
16
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

oder vom Controller

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

Auch für js / css / image URLs gibt es ein praktisches Funktionselement ()

<img src="{{ asset('image/logo.png') }}"/>
Schärpe
quelle
2
Bitte fügen Sie Ihrer Antwort eine weitere Erklärung hinzu - verwendet das Asset schließlich die baseUrl? In meinen Projekten wird nur eine relative URL gedruckt
Nico Haase
2

Anstatt eine 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>
Sethunath
quelle
2

Für die aktuelle Symfony-Version (zum Zeitpunkt des Schreibens dieser Antwort ist es Symfony 4.1) greifen Sie nicht wie in einigen anderen Antworten direkt auf den Service-Container zu.

Fügen Sie stattdessen (sofern Sie nicht die Standarddienstkonfiguration verwenden) das Anforderungsobjekt 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 zum Abrufen des aktuellen Anforderungsobjekts .

Arvid
quelle
0
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
Ivan Proskuryakov
quelle
0

In einer Situation mit einer Multi-Domain-Anwendung hat app.request.getHttpHostmir geholfen. Es gibt so etwas wie example.comoder zurück subdomain.example.com(oder example.com:8000wenn der Port nicht Standard ist). Dies war in Symfony 3.4.

ACJ
quelle
-1

Ich habe alle Optionen hier ausprobiert, aber sie haben bei mir nicht funktioniert. Irgendwann habe ich es zum Laufen gebracht

{{ Seiten-URL }}

Hoffe, das hilft jemandem, der immer noch Probleme hat.

user12531260
quelle
Woher kommt das? Was siteenthält?
Nico Haase
Das ist von Timber und Wordpress.
Konstantinos