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.