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).


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


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() }}

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() }}

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()

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.


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();

$this->container->get('request')->getSchemeAndHttpHost()
Alex Quintero

16
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

oder vom Controller

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

3

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

<img src="{{ asset('image/logo.png') }}"/>

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>

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 .



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.


-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.


Woher kommt das? Was siteenthält?
Nico Haase

Das ist von Timber und Wordpress.
Konstantinos
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.