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.
Tôi đang chuyển từ CodeIgniter sang Symfony 2. Ai đó có thể cho tôi một ví dụ về cách:
Câu trả lời:
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).
Đ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() }}
{{ app.request.baseUrl }}
(nó sẽ xác định vị trí các phương thức getter và gọi đó là tự động)
{{ app.request.getSchemeAndHttpHost() }}
hoạt động!
Bạn có thể sử dụng phương thức yêu cầu mới getSchemeAndHttpHost()
:
{{ app.request.getSchemeAndHttpHost() }}
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.
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()
Đố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()
<base href="{{ app.request.getSchemeAndHttpHost() }}"/>
hoặc từ bộ điều khiển
$this->container->get('router')->getContext()->getSchemeAndHttpHost()
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') }}"/>
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>
Đố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 .
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
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.
site
có?