รับ url ฐานของเว็บไซต์และส่งต่อไปยัง twig ใน Symfony 2 ทั่วโลก


92

ฉันกำลังเปลี่ยนจาก CodeIgniter เป็น Symfony 2 ใครช่วยยกตัวอย่างวิธีการ:

  • รับ url ฐาน (url ที่ไม่มีส่วนเฉพาะของเส้นทาง)
  • ส่งตัวแปรนี้ไปยังกลุ่ม twig ทั่วโลกดังนั้นฉันจึงสามารถใช้มันได้ในทุกเทมเพลต

คำตอบ:


91

ทำไมคุณต้องได้รับ url รูทนี้? คุณไม่สามารถสร้าง URL ที่สมบูรณ์โดยตรงได้หรือไม่?

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

โค้ด Twig นี้จะสร้าง http: // url แบบเต็มไปยังเส้นทาง _demo_hello

ในความเป็นจริงการรับ url ฐานของเว็บไซต์เป็นเพียงการรับ url แบบเต็มของเส้นทางหน้าแรก:

{{ url('homepage') }}

( หน้าแรกหรืออะไรก็ตามที่คุณเรียกในไฟล์เส้นทางของคุณ)


ขอบคุณมากฉันคิดว่านี่คือหนทางที่จะไป แต่ฉันรู้แค่เกี่ยวกับฟังก์ชัน {{path (.. )}} ซึ่งนำไปสู่ผลลัพธ์ที่ไม่ถูกต้อง {{url}} คือสิ่งที่ฉันต้องการ
Geoffrey De Vylder

ในกรณีที่ฉันกำลังเรนเดอร์ twig จากคำสั่ง symfony console สมมติว่าจะสร้างเทมเพลตอีเมลฉันต้องการ URL พื้นฐาน ฉันจะทำอย่างไรในกรณีนั้น
vishal

1
มีตำราสำหรับ: symfony.com/doc/master/cookbook/console/sending_emails.html
Damien

ถ้าฉันไม่ได้ใช้twigฉันจะเขียนสิ่งนี้ใหม่ในPHP ได้อย่างไร
Nis

1
Not workingFatal error: Uncaught Twig_Error_Syntax: ฟังก์ชัน "url" ที่ไม่รู้จักใน "default / template / extension / module / Featured.twig" ที่บรรทัดที่ 5 ใน J: \ xampp \ htdocs \ sites \ opencart3020 \ system \ library \ template \ Twig \ ExpressionParser.php: 574 Stack trace: # 0
Kamlesh

143

ขณะนี้สามารถใช้งานได้ฟรีในเทมเพลต twig (ทดสอบบน sf2 เวอร์ชัน 2.0.14)

{{ app.request.getBaseURL() }}

ใน Symfony เวอร์ชันหลัง ๆ (ทดสอบบน 2.5) ให้ลอง:

{{ app.request.getSchemeAndHttpHost() }}

36
สิ่งนี้สามารถย่อให้สั้นลงได้{{ app.request.baseUrl }}(มันจะค้นหาเมธอด getter และเรียกมันโดยอัตโนมัติ)
Colin O'Dell

2
@Colin O'Dell ยิ่งไปกว่านั้นมันยิ่งไม่น่าใช้วิธีการเรียกในมุมมอง - มุมมองไม่ควรรู้ว่ามีวิธีการใดในวัตถุ แม้ว่ามันจะดูแตกต่างกันเล็กน้อยใน symfony แต่ก็มี +10 สำหรับคำตอบนั้นอยู่ดี
thorinkor

1
ถ้าฉันไม่ได้ใช้twigฉันจะเขียนสิ่งนี้ใหม่ในPHP ได้อย่างไร
Nis

6
สิ่งนี้ใช้ไม่ได้ในเวอร์ชันที่ใหม่กว่า (ทดสอบบน sf 2.5) คำตอบด้านล่างได้{{ app.request.getSchemeAndHttpHost() }}ผล!
RayOnAir

55

คุณสามารถใช้วิธีการขอใหม่getSchemeAndHttpHost():

{{ app.request.getSchemeAndHttpHost() }}

1
ฟังก์ชันนี้เปิดตัวใน Symfony 2.1
COil

37

ใช้ได้ตั้งแต่ 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 ของคุณ


34

URL Symfony\Component\Routing\RequestContextพื้นฐานถูกกำหนดไว้ภายใน

สามารถดึงข้อมูลจากคอนโทรลเลอร์ดังนี้:

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

17

สำหรับ Symfony 2.3+ ในการรับ URL พื้นฐานในคอนโทรลเลอร์ควรเป็น

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

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


4

นอกจากนี้สำหรับ URL js / css / image ยังมีเนื้อหาฟังก์ชันที่มีประโยชน์ ()

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

2
โปรดเพิ่มคำอธิบายเพิ่มเติมในคำตอบของคุณ - เนื้อหาใช้ baseUrl หรือไม่ ในโปรเจ็กต์ของฉันมันพิมพ์ URL สัมพัทธ์
Nico Haase

2

แทนที่จะส่งตัวแปรไปยังเทมเพลตทั่วโลกคุณสามารถกำหนดเทมเพลตพื้นฐานและแสดงผล "ส่วนส่วนกลาง" ได้ แม่แบบฐานสามารถสืบทอดได้

ตัวอย่างเทมเพลตการแสดงผลจากเอกสาร symfony:

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

2

สำหรับ 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 อย่างเป็นทางการเกี่ยวกับวิธีการดึงวัตถุคำขอปัจจุบัน



0

ในสถานการณ์หนึ่งที่เกี่ยวข้องกับแอปพลิเคชันหลายโดเมนapp.request.getHttpHostช่วยฉันด้วย มันส่งคืนบางอย่างเช่นexample.comหรือsubdomain.example.com(หรือexample.com:8000เมื่อพอร์ตไม่ได้มาตรฐาน) สิ่งนี้อยู่ใน Symfony 3.4


0

ใน 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);
}

-1

ฉันลองใช้ตัวเลือกทั้งหมดที่นี่ แต่มันไม่ได้ผลสำหรับฉัน ในที่สุดฉันก็ใช้งานได้โดยใช้

{{site.url}}

หวังว่านี่จะช่วยคนที่ยังดิ้นรน


สิ่งนี้มาจากไหน? อะไรsiteมี?
Nico Haase

นั่นมาจาก Timber และ Wordpress
Konstantinos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.