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.
Jawaban:
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).
sumber
Ini sekarang tersedia secara gratis dalam template ranting (diuji pada sf2 versi 2.0.14)
Di versi Symfony yang lebih baru (diuji pada 2.5), coba:
sumber
{{ app.request.baseUrl }}
(ini akan menemukan metode pengambil dan memanggilnya secara otomatis){{ app.request.getSchemeAndHttpHost() }}
berhasil!Anda dapat menggunakan metode permintaan baru
getSchemeAndHttpHost()
:sumber
Berlaku dari Symfony v2.1 hingga v4.1 +
Jika Anda menginginkan URL dasar ke aplikasi Symfony, Anda harus menggunakan
getSchemeAndHttpHost()
concatenated together dengangetBaseUrl()
, serupa dengan caragetUri()
kerjanya, kecuali tanpa jalur router dan string kueri.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
Catatan:
getBaseUrl()
sertakan nama file skrip (yaitu/app.php
) jika ada di URL Anda.sumber
Url dasar didefinisikan di dalam
Symfony\Component\Routing\RequestContext
.Itu dapat diambil dari pengontrol seperti ini:
$this->container->get('router')->getContext()->getBaseUrl()
sumber
Untuk Symfony 2.3+, untuk mendapatkan url dasar di pengontrol harus
$this->get('request')->getSchemeAndHttpHost();
sumber
$this->container->get('request')->getSchemeAndHttpHost()
<base href="{{ app.request.getSchemeAndHttpHost() }}"/>
atau dari pengontrol
$this->container->get('router')->getContext()->getSchemeAndHttpHost()
sumber
Juga untuk url js / css / gambar ada fungsi aset yang berguna ()
<img src="{{ asset('image/logo.png') }}"/>
sumber
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>
sumber
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 .
sumber
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
sumber
Dalam satu situasi yang melibatkan aplikasi multi-domain,
app.request.getHttpHost
bantu saya. Ini mengembalikan sesuatu sepertiexample.com
atausubdomain.example.com
(atauexample.com:8000
ketika port tidak standar). Ini ada di Symfony 3.4.sumber
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); }
sumber
Saya mencoba semua opsi di sini tetapi tidak berhasil untuk saya. Akhirnya saya berhasil menggunakannya
Semoga ini bisa membantu seseorang yang masih berjuang.
sumber
site
isinya?