웹 사이트의 기본 URL을 가져 와서 Symfony 2의 나뭇 가지에 전역으로 전달


92

CodeIgniter에서 Symfony 2로 전환하고 있습니다. 누군가 다음 방법에 대한 예를 들어 주시겠습니까?

  • 기본 URL 가져 오기 (경로 특정 부분이없는 URL)
  • 이 변수를 모든 템플릿에서 사용할 수 있도록 twig 번들에 전역 적으로 전달합니다.

답변:


91

이 루트 URL이 필요한 이유는 무엇입니까? 직접 절대 URL을 생성 할 수 없습니까?

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

이 Twig 코드는 _demo_hello 경로에 대한 전체 http : // URL을 생성합니다.

사실, 웹 사이트의 기본 URL을 얻는 것은 홈페이지 경로의 전체 URL 만 얻는 것입니다.

{{ url('homepage') }}

( 홈페이지 또는 라우팅 파일에서 호출하는 이름).


정말 감사합니다. 이것이 갈 길이라고 생각했지만 {{path (..)}} 함수에 대해서만 알고있어 잘못된 결과가 발생했습니다. {{url}}은 내가 필요한 것입니다.
Geoffrey De Vylder 2011-07-28

심포니 콘솔 명령에서 나뭇 가지를 렌더링하는 경우 이메일 템플릿을 생성하려면 기본 URL이 필요합니다. 이 경우 어떻게해야합니까?
vishal


나뭇 가지 를 사용하지 않는 경우 어떻게 PHP로 다시 작성할 수 있습니까?
Nis

1
작동하지 않음 치명적인 오류 : Uncaught Twig_Error_Syntax : J : \ xampp \ htdocs \ sites \ opencart3020 \ system \ library \ template \ Twig \의 5 행에있는 "default / template / extension / module / featured.twig"의 알 수없는 "url"함수 ExpressionParser.php : 574 스택 추적 : # 0
Kamlesh

143

이제 나뭇 가지 템플릿에서 무료로 사용할 수 있습니다 (sf2 버전 2.0.14에서 테스트 됨).

{{ app.request.getBaseURL() }}

이후 Symfony 버전 (2.5에서 테스트 됨)에서는 다음을 시도하십시오.

{{ app.request.getSchemeAndHttpHost() }}

36
이것은 단축 될 수도 있습니다 {{ app.request.baseUrl }}(게터 메서드를 찾아 자동으로 호출합니다)
Colin O'Dell 2013

2
@Colin O'Dell 또한 뷰에서 메서드 호출을 사용하지 않는 것이 훨씬 더 적절합니다. 뷰는 객체에 어떤 메서드가 있는지 알면 안됩니다. 심포니에서는 약간 다르게 보이지만 어쨌든 그 대답에 대해서는 +10입니다.
thorinkor

1
나뭇 가지 를 사용하지 않는 경우 어떻게 PHP로 다시 작성할 수 있습니까?
Nis

6
이것은 이후 버전에서 작동하지 않습니다 (sf 2.5에서 테스트 됨). 아래 답변이 {{ app.request.getSchemeAndHttpHost() }}작동합니다!
RayOnAir

55

새 요청 방법을 사용할 수 있습니다 getSchemeAndHttpHost().

{{ app.request.getSchemeAndHttpHost() }}

1
이 기능은 심포니 2.1에 도입 된
코일

37

Symfony v2.1부터 v4.1 이상까지 유효

Symfony 애플리케이션에 대한 기본 URL을 원하는 경우 라우터 경로 및 쿼리 문자열이없는 경우를 제외하고 작동 방식 과 유사하게 getSchemeAndHttpHost()와 함께 연결 을 사용해야 합니다.getBaseUrl()getUri()

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

예를 들어 Symfony 웹 사이트 URL이에있는 https://www.stackoverflow.com/app1/경우 다음 두 메서드가 다음 값을 반환합니다.

getSchemeAndHttpHost

https://www.stackoverflow.com

getBaseUrl

/app1

참고 : URL에있는 경우 getBaseUrl()스크립트 파일 이름 (예 :)을 포함합니다 /app.php.


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

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

또는 컨트롤러에서

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

4

또한 js / css / image URL의 경우 편리한 함수 asset ()이 있습니다.

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

2
답변에 더 많은 설명을 추가하십시오-자산은 결국 baseUrl을 사용합니까? 내 프로젝트에서는 상대 URL 만 인쇄합니다
Nico Haase

2

템플릿에 전역 적으로 변수를 전달하는 대신 기본 템플릿을 정의하고 그 안에 '전역 부분'을 렌더링 할 수 있습니다. 기본 템플릿은 상속 될 수 있습니다.

심포니 문서에서 템플릿 렌더링의 예 :

<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와 컨트롤러 메서드의 일반적인 상황에서는 삽입 된 요청을 사용합니다. 객체를 합니다.

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.