Mendapatkan url dasar situs web dan secara global meneruskannya ke ranting di Symfony 2


Jawaban:


91

Mengapa Anda perlu mendapatkan url root ini? Tidak bisakah Anda membuat URL absolut secara langsung?

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

Kode Twig ini akan menghasilkan http: // url lengkap ke rute _demo_hello.

Faktanya, mendapatkan url dasar situs web hanya mendapatkan url lengkap dari rute beranda:

{{ url('homepage') }}

( beranda , atau apa pun Anda menyebutnya dalam file perutean Anda).


Terima kasih banyak, saya pikir ini cara yang harus dilakukan tetapi saya hanya tahu tentang fungsi {{path (..)}}, yang mengarah ke hasil yang salah. {{url}} hanya yang saya butuhkan.
Geoffrey De Vylder

apa jika saya merender ranting dari perintah konsol symfony, katakanlah untuk menghasilkan template email, saya memerlukan URL dasar. Bagaimana saya melakukannya dalam kasus itu.
vishal


Jika saya tidak menggunakan ranting lalu bagaimana saya bisa menulis ulang ini di PHP ?
Nis

1
Kesalahan fatal: Tidak tertangkap Twig_Error_Syntax: Fungsi "url" tidak dikenal di "default / template / extension / module / Featured.twig" di baris 5. di J: \ xampp \ htdocs \ sites \ opencart3020 \ system \ library \ template \ Twig \ ExpressionParser.php: 574 Stack trace: # 0
Kamlesh

143

Ini sekarang tersedia secara gratis dalam template ranting (diuji pada sf2 versi 2.0.14)

{{ app.request.getBaseURL() }}

Di versi Symfony yang lebih baru (diuji pada 2.5), coba:

{{ app.request.getSchemeAndHttpHost() }}

36
Ini bahkan dapat disingkat menjadi {{ app.request.baseUrl }}(ini akan menemukan metode pengambil dan memanggilnya secara otomatis)
Colin O'Dell

2
Lebih jauh, @Colin O'Dell, bahkan lebih tepat untuk TIDAK MENGGUNAKAN pemanggilan metode dalam tampilan - tampilan seharusnya tidak mengetahui metode apa yang ada di objek. Meskipun tampilannya sedikit berbeda di symfony, tetapi +10 untuk jawaban itu.
thorinkor

1
Jika saya tidak menggunakan ranting lalu bagaimana saya bisa menulis ulang ini di PHP ?
Nis

6
Ini TIDAK berfungsi di versi yang lebih baru (diuji pada sf 2.5). Jawaban di bawah ini {{ app.request.getSchemeAndHttpHost() }}berhasil!
RayOnAir

55

Anda dapat menggunakan metode permintaan baru getSchemeAndHttpHost():

{{ app.request.getSchemeAndHttpHost() }}

1
Fungsi ini diperkenalkan di Symfony 2.1
COil

37

Berlaku dari Symfony v2.1 hingga v4.1 +

Jika Anda menginginkan URL dasar ke aplikasi Symfony, Anda harus menggunakan getSchemeAndHttpHost()concatenated together dengan getBaseUrl(), serupa dengan cara getUri()kerjanya, kecuali tanpa jalur router dan string kueri.

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

Misalnya, jika URL situs web Symfony Anda berada di https://www.stackoverflow.com/app1/, maka kedua metode ini mengembalikan nilai berikut:

getSchemeAndHttpHost

https://www.stackoverflow.com

getBaseUrl

/app1

Catatan: getBaseUrl()sertakan nama file skrip (yaitu /app.php) jika ada di URL Anda.


34

Url dasar didefinisikan di dalam Symfony\Component\Routing\RequestContext.

Itu dapat diambil dari pengontrol seperti ini:

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

17

Untuk Symfony 2.3+, untuk mendapatkan url dasar di pengontrol harus

$this->get('request')->getSchemeAndHttpHost();

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

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

atau dari pengontrol

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

4

Juga untuk url js / css / gambar ada fungsi aset yang berguna ()

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

2
Harap tambahkan beberapa penjelasan lagi ke jawaban Anda - apakah aset menggunakan baseUrl? Dalam proyek saya, itu hanya mencetak URL relatif
Nico Haase

2

Alih-alih meneruskan variabel ke template secara global, Anda dapat menentukan template dasar dan membuat 'bagian global' di dalamnya. Template dasar dapat diwariskan.

Contoh rendering template Dari Dokumentasi symfony:

<div id="sidebar">
  {% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %}
</div>

2

Untuk versi Symfony saat ini (saat menulis jawaban ini adalah Symfony 4.1) jangan langsung mengakses service container seperti yang dilakukan di beberapa jawaban lain.

Sebagai gantinya (kecuali Anda tidak menggunakan konfigurasi layanan standar), masukkan objek permintaan dengan petunjuk tipe.

<?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;
    }
}

Lihat juga dokumen resmi Symfony tentang cara mengambil objek permintaan saat ini .



0

Dalam satu situasi yang melibatkan aplikasi multi-domain, app.request.getHttpHostbantu saya. Ini mengembalikan sesuatu seperti example.comatau subdomain.example.com(atau example.com:8000ketika port tidak standar). Ini ada di Symfony 3.4.


0

Di Symfony 5 dan dalam situasi umum metode pengontrol, gunakan objek Request yang dimasukkan :

public function controllerFunction(Request $request, LoggerInterface $logger)
  ...
  $scheme = $request->getSchemeAndHttpHost();
  $logger->info('Domain is: ' . $scheme);
  ...
  //prepare to render
  $retarray = array(
    ...
    'scheme' => $scheme,
    ...
    );
  return $this->render('Template.html.twig', $retarray);
}

-1

Saya mencoba semua opsi di sini tetapi tidak berhasil untuk saya. Akhirnya saya berhasil menggunakannya

{{ alamat URL }}

Semoga ini bisa membantu seseorang yang masih berjuang.


Dari mana asalnya Apa siteisinya?
Nico Haase

Itu dari Timber dan Wordpress.
Konstantinos
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.