Lấy url cơ sở của trang web và chuyển toàn cầu đến twig trong Symfony 2


89

Tôi đang chuyển từ CodeIgniter sang Symfony 2. Ai đó có thể cho tôi một ví dụ về cách:

  • Lấy url cơ sở (url không có các phần cụ thể của tuyến đường)
  • Chuyển toàn cầu biến này vào bó cành cây để tôi có thể sử dụng nó trong mọi mẫu.

Câu trả lời:


92

Tại sao bạn cần lấy url gốc này? Bạn không thể tạo trực tiếp URL tuyệt đối?

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

Mã Twig này sẽ tạo ra http: // url đầy đủ cho tuyến _demo_hello.

Trên thực tế, việc lấy url cơ sở của trang web chỉ lấy được url đầy đủ của tuyến trang chủ:

{{ url('homepage') }}

( trang chủ hoặc bất cứ thứ gì bạn gọi nó trong tệp định tuyến của mình).


Cảm ơn rất nhiều, tôi nghĩ đây là cách để đi nhưng tôi chỉ biết về hàm {{path (..)}}, dẫn đến kết quả sai. {{url}} là những gì tôi cần.
Geoffrey De Vylder

Trong trường hợp tôi đang kết xuất twig từ lệnh giao diện điều khiển của symfony, giả sử để tạo mẫu email, tôi cần URL cơ sở. Tôi phải làm thế nào trong trường hợp đó.
vishal

1
Có một sách dạy nấu ăn cho rằng: symfony.com/doc/master/cookbook/console/sending_emails.html
Damien

Nếu tôi không sử dụng twig thì làm thế nào tôi có thể viết lại điều này trong PHP ?
Nis

1
Không hoạt động Lỗi hệ thống: Chưa có Twig_Error_Syntax: Hàm "url" không xác định trong "default / template / extension / module / feature.twig" tại dòng 5. trong J: \ xampp \ htdocs \ sites \ opencart3020 \ system \ library \ template \ Twig \ ExpressionParser.php: 574 Dấu vết ngăn xếp: # 0
Kamlesh

143

Điều này hiện có sẵn miễn phí trong các mẫu cành cây (được thử nghiệm trên sf2 phiên bản 2.0.14)

{{ app.request.getBaseURL() }}

Trong các phiên bản Symfony mới hơn (được thử nghiệm trên 2.5), hãy thử:

{{ app.request.getSchemeAndHttpHost() }}

36
Điều này thậm chí có thể được rút ngắn xuống còn {{ app.request.baseUrl }}(nó sẽ xác định vị trí các phương thức getter và gọi đó là tự động)
Colin O'Dell

2
@Colin O'Dell hơn nữa, điều đáng quan tâm hơn là KHÔNG SỬ DỤNG các cuộc gọi phương thức trong khung nhìn - khung nhìn không nên biết những phương thức nào trong đối tượng. Mặc dù nó trông hơi khác trong symfony, nhưng dù sao thì +10 cho câu trả lời đó.
thorinkor

1
Nếu tôi không sử dụng twig thì làm thế nào tôi có thể viết lại điều này trong PHP ?
Nis

6
Điều này KHÔNG hoạt động trong các phiên bản sau (được thử nghiệm trên sf 2.5). Câu trả lời dưới đây {{ app.request.getSchemeAndHttpHost() }}hoạt động!
RayOnAir

55

Bạn có thể sử dụng phương thức yêu cầu mới getSchemeAndHttpHost():

{{ app.request.getSchemeAndHttpHost() }}

1
Chức năng này đã được giới thiệu trong Symfony 2.1
COil

35

Có hiệu lực từ Symfony v2.1 đến v4.1 +

Nếu bạn muốn URL cơ sở cho một ứng dụng Symfony, bạn nên sử dụng getSchemeAndHttpHost()nối với nhau getBaseUrl(), tương tự như cách getUri()hoạt động, ngoại trừ không có đường dẫn bộ định tuyến và chuỗi truy vấn.

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

Ví dụ: nếu URL trang web Symfony của bạn có tại https://www.stackoverflow.com/app1/, thì hai phương pháp này trả về các giá trị sau:

getSchemeAndHttpHost

https://www.stackoverflow.com

getBaseUrl

/app1

Lưu ý: getBaseUrl()bao gồm tên tệp tập lệnh (tức là /app.php) nếu nó có trong URL của bạn.


34

Url cơ sở được xác định bên trong Symfony\Component\Routing\RequestContext.

Nó có thể được tìm nạp từ bộ điều khiển như thế này:

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

17

Đối với Symfony 2.3+, để lấy url cơ sở trong bộ điều khiển phải

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

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

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

hoặc từ bộ điều khiển

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

3

Ngoài ra đối với các url js / css / image còn có nội dung hàm tiện dụng ()

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

2
Vui lòng thêm một số giải thích cho câu trả lời của bạn - nội dung có sử dụng baseUrl không? Trong các dự án của tôi, nó chỉ in một URL có liên quan
Nico Haase

2

Thay vì chuyển biến cho mẫu trên toàn cầu, bạn có thể xác định một mẫu cơ sở và hiển thị 'phần chung' trong đó. Mẫu cơ sở có thể được kế thừa.

Ví dụ về kết xuất mẫu từ Tài liệu symfony:

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

2

Đối với phiên bản Symfony hiện tại (khi viết câu trả lời này, đó là Symfony 4.1), không truy cập trực tiếp vào vùng chứa dịch vụ như được thực hiện trong một số câu trả lời khác.

Thay vào đó (trừ khi bạn không sử dụng cấu hình dịch vụ tiêu chuẩn), hãy đưa đối tượng yêu cầu vào bằng cách gõ kiểu gợi ý.

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

Xem thêm tài liệu chính thức của Symfony về cách truy xuất đối tượng yêu cầu hiện tại .



0

Trong một tình huống liên quan đến ứng dụng nhiều miền, app.request.getHttpHostđã giúp tôi. Nó trả về một cái gì đó giống như example.comhoặc subdomain.example.com(hoặc example.com:8000khi cổng không chuẩn). Đây là trong Symfony 3.4.


-1

Tôi đã thử tất cả các tùy chọn ở đây nhưng chúng không hiệu quả với tôi. Cuối cùng tôi đã làm cho nó hoạt động bằng cách sử dụng

{{site.url}}

Hy vọng điều này sẽ giúp một người nào đó vẫn đang gặp khó khăn.


Trường hợp nào này đến từ đâu? Không gì sitecó?
Nico Haase

Đó là từ Timber và Wordpress.
Konstantinos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.