wake-up-neo.net

Holen Sie sich die Basis-URL der Website und geben Sie sie in Symfony 2 global an twig weiter

Ich mache den Wechsel von CodeIgniter zu Symfony 2. Kann mir jemand ein Beispiel geben, 

  • Holen Sie sich die Basis-URL (die URL ohne die für die Route spezifischen Teile).
  • Übergeben Sie diese Variable global an das Zweigbündel, damit ich sie in jeder Vorlage verwenden kann.
76
geoffreydv

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

81
Damien

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

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

{{ app.request.getSchemeAndHttpHost() }}
49
Hugo Nogueira

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

Es kann wie folgt vom Controller abgerufen werden:

$this->container->get('router')->getContext()->getBaseUrl()
32
sumanchalki

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.

24
Matt Janssen

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

$this->get('request')->getSchemeAndHttpHost();
15
Mr. 14
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

oder vom Controller

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

Auch für js/css/image URLs gibt es eine praktische Funktion asset ().

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

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>
2
Sethunath

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 .

1
Arvid
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
0

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.

0
ACJ