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

92

Saya beralih dari CodeIgniter ke Symfony 2. Bisakah seseorang memberi saya contoh tentang cara:

  • Dapatkan url dasar (url tanpa bagian tertentu rute)
  • Secara global, berikan variabel ini ke bundel ranting sehingga saya dapat menggunakannya di setiap template.
Geoffrey De Vylder
sumber

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

Damien
sumber
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() }}
codecowboy
sumber
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() }}
Hugo Nogueira
sumber
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.

Matt Janssen
sumber
34

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

Itu dapat diambil dari pengontrol seperti ini:

$this->container->get('router')->getContext()->getBaseUrl()
sumanchalki.dll
sumber
17

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

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

atau dari pengontrol

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

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

<img src="{{ asset('image/logo.png') }}"/>
Selempang
sumber
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>
Sethunath
sumber
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 .

Arvid
sumber
0
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
Ivan Proskuryakov
sumber
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.

ACJ
sumber
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);
}
Vladtn
sumber
-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.

pengguna12531260
sumber
Dari mana asalnya Apa siteisinya?
Nico Haase
Itu dari Timber dan Wordpress.
Konstantinos