có được url hiện tại trong mẫu twig?


169

Tôi đã tìm xung quanh mã để có được đường dẫn hiện tại trong mẫu Twig (chứ không phải URL đầy đủ), tức là tôi không muốn http://www.sitename.com/page, tôi chỉ cần /page.


11
Đây KHÔNG phải là một bản sao chính xác, vì câu trả lời số 2 chứa thông tin cần thiết (về các tham số yêu cầu) mà câu hỏi được liên kết không cung cấp. Người ta nên hợp nhất câu trả lời số 2 vào câu hỏi được liên kết.
Victor Sergienko

1
thử app.request.requestUri.
Kristóf Dombi

7
Không phải là một bản dupe nào cả. Bỏ phiếu để mở lại. Đăng câu trả lời của tôi dưới dạng nhận xét vì tôi không được phép trả lời ngay bây giờ ... {{ app.request.getBaseUrl ~ app.request.getPathInfo }}( getBaseUrlbit là tùy chọn; chỉ cần nếu không được cài đặt vào root của tên miền)
mpen

Câu trả lời:


250
{{ path(app.request.attributes.get('_route'),
     app.request.attributes.get('_route_params')) }}

Nếu bạn muốn đọc nó thành một biến xem:

{% set currentPath = path(app.request.attributes.get('_route'),
                       app.request.attributes.get('_route_params')) %}

Các appbiến quan điểm toàn cầu chứa tất cả các loại phím tắt hữu ích, chẳng hạn như app.sessionapp.security.token.user, mà tham khảo các dịch vụ mà bạn có thể sử dụng trong một bộ điều khiển.


9
thật không may, điều này sẽ không hoạt động nếu bạn có một tuyến đường với các tham số bắt buộc.
Martin Schuhfuß

Nếu bạn đang sử dụng Twig mà không có Symfony, bạn có thể làm một cái gì đó như thế này: $ twig-> addGlobal ("CurrentUrl", $ _SERVER ["REQUEST_URI"]);
GateKiller

1
Nếu tuyến đường của bạn có các tham số bắt buộc, hãy xem câu trả lời dưới đây .
Sam

@GateKiller Điều này khiến thử nghiệm chức năng của tôi thất bại:Uncaught PHP Exception PHPUnit_Framework_Error_Notice: "Undefined index: REQUEST_URI"
Robin

Cảm ơn cho một câu trả lời tuyệt vời, rất hữu ích!
Vahe Shadunts 10/03/2015

199

Nhận url hiện tại : {{ app.request.uri }}trong Symfony 2.3, 3, 4, 5


Chỉ nhận đường dẫn : {{ app.request.pathinfo }}(không có tham số)


Nhận yêu cầu uri : {{ app.request.requesturi }}(có tham số)


1
Đây là người duy nhất làm việc cho tôi. Tất cả những cái khác đã bỏ lỡ các tham số truy vấn không phải là một phần của tuyến đường, hoặc dựa vào bộ điều khiển và thay vì Twig.
Craig

13
Để có được đường dẫn, chỉ cần thử {{ app.request.pathinfo }}hoặc xem danh sách các phương thức khả dụng trong/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
Michael

2
Đây phải là câu trả lời chính xác. Ngắn và mịn.
Fabian Picon

2
urilấy URL với các tham số. pathinfođược đường dẫn với các tham số NO . requestUriđược đường dẫn VỚI tham số. requestUrinên được thêm vào câu trả lời này IMO. Bạn sẽ hiếm khi cần tên miền và hiếm khi bạn muốn xóa các tham số.
rybo111

115

Trong symfony 2.1 bạn có thể sử dụng điều này:

{{ path(app.request.attributes.get('_route'), 
        app.request.attributes.get('_route_params')) }}

Trong symfony 2.0, một giải pháp là viết phần mở rộng twig cho phần này

public function getFunctions()
{
    return array(
        'my_router_params' => new \Twig_Function_Method($this, 'routerParams'),
    );
}

/**
 * Emulating the symfony 2.1.x $request->attributes->get('_route_params') feature.
 * Code based on PagerfantaBundle's twig extension.
 */
public function routerParams()
{
    $router = $this->container->get('router');
    $request = $this->container->get('request');

    $routeName = $request->attributes->get('_route');
    $routeParams = $request->query->all();
    foreach ($router->getRouteCollection()->get($routeName)->compile()->getVariables() as $variable) {
        $routeParams[$variable] = $request->attributes->get($variable);
    }

    return $routeParams;
}

Và sử dụng như thế này

{{ path(app.request.attributes.get('_route'), my_router_params()|merge({'additional': 'value'}) }}

Bạn sẽ không cần tất cả điều này trừ khi bạn muốn thêm các tham số bổ sung vào các liên kết của mình, như trong máy nhắn tin hoặc bạn muốn thay đổi một trong các tham số.


11
Nếu bạn muốn tạo liên kết hiện tại trong Twig và thay đổi ngôn ngữ để chuyển đổi ngôn ngữ, thì có thể thực hiện trong Symfony 2.1 như sau: {{path (app.request.attribut.get ('_ route'), app.request.attribut .get ('_ route_params') | merge ({'_ locale': 'ja'}))}} Nó có thể hoạt động nếu bạn sử dụng tiện ích mở rộng Twig của Bártfai Tamás
Naytzyrhc

Đối với triển khai 2.0 của bạn, tôi gặp lỗi khi nói rằng không có vùng chứa. Vì vậy, tôi đã thêm biến như được thực hiện trong PagerfantaBundle, nhưng sau đó nó nói tôi phải triển khai ContainerInterface?
Squazic

Bạn phải tạo một hàm tạo cho phần mở rộng này, có tham số $ container. Sau đó, trong cấu hình DIC, bạn phải khai báo vùng chứa làm tham số cho phần mở rộng. Giống như ở đây trong TwigBundle
Bártfai Tamás

12
_Route_parameter sẽ không hoạt động nếu bạn có một số thông số bổ sung trong chuỗi truy vấn của mình. Bạn có thể sử dụng app.request.query.all để thay thế.
wdev

34

Bạn có thể nhận URL hiện tại trong Twig như thế này:

{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}

20

Cần lưu ý rằng nếu bạn có các tham số truy vấn bổ sung trong URL của mình, thì không là một phần của tuyến đường được định cấu hình, câu trả lời được chấp nhận sẽ không bao gồm chúng trong URL (đường dẫn) hiện tại.

Tại sao bạn muốn có thêm thông số?

Ví dụ: nếu bạn có một trang danh sách với các bản ghi có thể được lọc theo từ khóa và trang có phân trang, rất có thể các biến truy vấn cho "từ khóa" và "trang" sẽ không nằm trong lộ trình của bạn. Nhưng trong các nút chuyển tiếp và quay lại để phân trang, bạn cần có URL hiện tại đầy đủ (có chứa các từ khóa để trang tiếp theo vẫn được lọc). Và bạn cần sửa đổi biến trang.

Cách hợp nhất trong các tham số truy vấn bổ sung

Vì vậy, bạn có thể có được tuyến đường hiện tại và hợp nhất trong các biến phụ (sau khi sửa đổi một hoặc nhiều biến phụ đó). Lưu ý rằng bạn đang hợp nhất các biến của riêng bạn với app.request.query.all, và sau đó hợp nhất mảng đó vào app.request.attributes.get('_route_params'). Các path()phương pháp yêu cầu bạn cung cấp tất cả các thông số cần thiết của tuyến đường, đó là lý do tại sao bạn cần phải bao gồm _route_params.

{{ path(app.request.attributes.get('_route'), app.request.attributes.get('_route_params')|merge(app.request.query.all|merge({'page': 2 }))) }}

Điều đó thực sự xấu xí, nhưng nếu bạn đang phát triển phân trang, bạn sẽ cần sửa đổi biến trang trên mỗi liên kết riêng biệt, vì vậy bạn phải bao gồm toàn bộ mỗi lần. Có lẽ những người khác có một giải pháp tốt hơn.


2
Có lẽ nên là{{ path(app.request.attributes.get('_route'), app.request.query.all|merge(app.request.attributes.get('_route_params'))) }}
FDisk

2

Nếu bạn đang sử dụng Silex 2, bạn không thể truy cập đối tượng Yêu cầu nữa.

Bạn có thể truy cập các thuộc tính yêu cầu hiện tại theo cách này.

app.request_stack.currentrequest.attributes.get('_route')

Và để tạo URL đầy đủ hiện tại: path(app.request_stack.currentrequest.attributes.get('_route'), app.request_stack.currentrequest.attributes.get('_route_params'))


Bạn có thể nhận URL hiện tại trong Twig / Silex 2 như thế này : global.request.attributes.get('_route'). Cầu Twig là bắt buộc.
DSoms
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.