ฉันกำลังเปลี่ยนจาก CodeIgniter เป็น Symfony 2 ใครช่วยยกตัวอย่างวิธีการ:
- รับ url ฐาน (url ที่ไม่มีส่วนเฉพาะของเส้นทาง)
- ส่งตัวแปรนี้ไปยังกลุ่ม twig ทั่วโลกดังนั้นฉันจึงสามารถใช้มันได้ในทุกเทมเพลต
ฉันกำลังเปลี่ยนจาก CodeIgniter เป็น Symfony 2 ใครช่วยยกตัวอย่างวิธีการ:
คำตอบ:
ทำไมคุณต้องได้รับ url รูทนี้? คุณไม่สามารถสร้าง URL ที่สมบูรณ์โดยตรงได้หรือไม่?
{{ url('_demo_hello', { 'name': 'Thomas' }) }}
โค้ด Twig นี้จะสร้าง http: // url แบบเต็มไปยังเส้นทาง _demo_hello
ในความเป็นจริงการรับ url ฐานของเว็บไซต์เป็นเพียงการรับ url แบบเต็มของเส้นทางหน้าแรก:
{{ url('homepage') }}
( หน้าแรกหรืออะไรก็ตามที่คุณเรียกในไฟล์เส้นทางของคุณ)
ขณะนี้สามารถใช้งานได้ฟรีในเทมเพลต twig (ทดสอบบน sf2 เวอร์ชัน 2.0.14)
{{ app.request.getBaseURL() }}
ใน Symfony เวอร์ชันหลัง ๆ (ทดสอบบน 2.5) ให้ลอง:
{{ app.request.getSchemeAndHttpHost() }}
{{ app.request.baseUrl }}
(มันจะค้นหาเมธอด getter และเรียกมันโดยอัตโนมัติ)
{{ app.request.getSchemeAndHttpHost() }}
ผล!
คุณสามารถใช้วิธีการขอใหม่getSchemeAndHttpHost()
:
{{ app.request.getSchemeAndHttpHost() }}
ใช้ได้ตั้งแต่ Symfony v2.1 ถึง v4.1 +
หากคุณต้องการให้ URL พื้นฐานไปยังแอปพลิเคชัน Symfony คุณควรใช้แบบgetSchemeAndHttpHost()
เรียงต่อกันgetBaseUrl()
ซึ่งคล้ายกับวิธีการgetUri()
ทำงานยกเว้นไม่มีเส้นทางเราเตอร์และสตริงการสืบค้น
{{ app.request.schemeAndHttpHost ~ app.request.baseUrl }}
ตัวอย่างเช่นหาก URL ของเว็บไซต์ Symfony ของคุณอยู่ที่https://www.stackoverflow.com/app1/
สองวิธีการเหล่านี้จะคืนค่าเหล่านี้:
getSchemeAndHttpHost
https://www.stackoverflow.com
getBaseUrl
/app1
หมายเหตุ: getBaseUrl()
รวมชื่อไฟล์สคริปต์ (เช่น/app.php
) หากอยู่ใน URL ของคุณ
URL Symfony\Component\Routing\RequestContext
พื้นฐานถูกกำหนดไว้ภายใน
สามารถดึงข้อมูลจากคอนโทรลเลอร์ดังนี้:
$this->container->get('router')->getContext()->getBaseUrl()
สำหรับ Symfony 2.3+ ในการรับ URL พื้นฐานในคอนโทรลเลอร์ควรเป็น
$this->get('request')->getSchemeAndHttpHost();
$this->container->get('request')->getSchemeAndHttpHost()
<base href="{{ app.request.getSchemeAndHttpHost() }}"/>
หรือจากตัวควบคุม
$this->container->get('router')->getContext()->getSchemeAndHttpHost()
นอกจากนี้สำหรับ URL js / css / image ยังมีเนื้อหาฟังก์ชันที่มีประโยชน์ ()
<img src="{{ asset('image/logo.png') }}"/>
แทนที่จะส่งตัวแปรไปยังเทมเพลตทั่วโลกคุณสามารถกำหนดเทมเพลตพื้นฐานและแสดงผล "ส่วนส่วนกลาง" ได้ แม่แบบฐานสามารถสืบทอดได้
ตัวอย่างเทมเพลตการแสดงผลจากเอกสาร symfony:
<div id="sidebar">
{% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %}
</div>
สำหรับ Symfony เวอร์ชันปัจจุบัน (ขณะที่เขียนคำตอบนี้คือ Symfony 4.1) จะไม่เข้าถึงที่เก็บบริการโดยตรงเหมือนที่ทำในคำตอบอื่น ๆ
แทน (เว้นแต่คุณจะไม่ได้ใช้การกำหนดค่าบริการมาตรฐาน) ให้ฉีดวัตถุคำขอโดยการบอกใบ้
<?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;
}
}
ดูเพิ่มเติมเอกสาร Symfony อย่างเป็นทางการเกี่ยวกับวิธีการดึงวัตถุคำขอปัจจุบัน
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
ในสถานการณ์หนึ่งที่เกี่ยวข้องกับแอปพลิเคชันหลายโดเมนapp.request.getHttpHost
ช่วยฉันด้วย มันส่งคืนบางอย่างเช่นexample.com
หรือsubdomain.example.com
(หรือexample.com:8000
เมื่อพอร์ตไม่ได้มาตรฐาน) สิ่งนี้อยู่ใน Symfony 3.4
ใน Symfony 5 และในสถานการณ์ทั่วไปของเมธอดคอนโทรลเลอร์ให้ใช้อ็อบเจ็กต์Request ที่ถูกแทรก:
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);
}
ฉันลองใช้ตัวเลือกทั้งหมดที่นี่ แต่มันไม่ได้ผลสำหรับฉัน ในที่สุดฉันก็ใช้งานได้โดยใช้
{{site.url}}
หวังว่านี่จะช่วยคนที่ยังดิ้นรน
site
มี?