내 Symfony2 프로젝트에서 저는 HTML을 렌더링하기 위해 Twig 템플릿을 사용합니다. 웹 사이트의 각 페이지에 "애플리케이션 바"가 필요합니다. 이 막대의 내용은 사용자가 누구인지, 자신이 갖고있는 권한 등에 따라 다릅니다. 즉, 뒤에서 실행해야하는 약간의 비즈니스 로직이 있습니다. 분명한 해결책은 기본 템플릿에 앱 표시 줄을 추가하는 것입니다 (각 페이지에 표시해야하기 때문에). 그러나이 문제는 비즈니스 논리를 기본 (상위) Twig 템플릿에서 실행하는 방법이 명확하지 않다는 점입니다.상위 Twig 템플릿에서 PHP 비즈니스 로직 호출하기
@Flukey는 this question에서 비슷한 문제가 발생했습니다. 그의 해결책은 나뭇 가지 템플릿 내에서 render
하위 컨트롤러로되어 보조 컨트롤러의 실행을 강제합니다. 명시하기 위해, 자신의 솔루션은 다음과 보이는 :
{# ::base:html.twig #}
<!DOCTYPE html>
<html>
<head>
<title>blah</title>
{% block stylesheets %}{# default styles #}{% endblock %}
</head>
<body>
{# Question: is there a way to do add the app-bar without "render"? #}
{% render url('app_bar_route') %}
{% block body %}{% endblock %}
{% block javascripts %}{% endblock %}
</body>
</html>
그리고 아이 :
는render
이 작동하기 위해서는
{# AcmeDemoBundle:userpage.html.twig #}
{% extends '::base.html.twig' %}
{% block body %}user content here; Twig file rendered from "primary" PHP Controller.{% endblock %}
, 우리는 또한 정의 할 경로를 필요로를 :
# routing.yml
app_bar_route:
pattern: /sitestructure/appbar
defaults: { _controller: SiteManagerBundle:AppBar:index }
하지만이 솔루션은 다음과 같은 이유 때문에 저와 함께 매우 불안합니다.
-
,
- 첫째,이 솔루션은 당신이
- 둘째 사이트의 각 탐색 바에 대해 별도의 새로운 URL을 관리해야한다는 것을 의미,은 (위의 예에서
http://mysite/sitestructure/appbar
) 별도의 사이트에있는 모든 탐색 바의 URL이 입니다 , 그냥 매우 혼란스럽게 보입니다. - 세 번째로 this concern about performance이 있습니다.이 부분은 매우 현명한 관심사입니다. HTML 페이지에 대한 개별 사용자 요청이 서버에 2 ~ 3 건의 실제 요청을 보내야하는 이유는 알 수 없습니다. - 사이트의 각 탐색 바에 대한 추가
render
요청 (더 많은 nav- 사이트가 더 복잡 해짐에 따라 막대가 추가 될 가능성이 높음).
이렇게하는 더 좋은 방법이 있습니까? {% render %}
대신 Twig의 {% include %}
기능을 사용할 수 있습니까? 그렇다면 기본 템플릿의 비즈니스 로직은 어떻게 실행됩니까?
편집 : , 나는 데이터베이스 호출을 필요로하는 참조 '비즈니스 로직'의 유형을 명확히하기 위해 - 그것은 내가 템플릿에 코드를하려는 논리의 유형이 아니다을, 그래서 얻기 위해 어떻게 든 필요 PHP 클래스/함수로 돌아 간다.
EDIT2 : 하위 컨트롤러를 호출하는 것에 대해 정말로 걱정해야합니까? 아마도 나는 render
엔진이 작동하는 방식을 오해했을 것입니다. 나는 이것이 웹 서버 (웹 브라우저가 아닌 서버 자체의 내부 서버)에 대한 두 번째 HTTP 요청을 생성한다고 가정했습니다. 필자에게 이것은 일종의 응답 오류가 발생할 확률이 증가하는 것은 말할 것도없이 상당한 간접비를 의미하는 것으로 보입니다. 그러나 어쩌면 나는 틀을 오해 해왔다.
"비즈니스 로직"에는 아마도 데이터베이스 호출이 포함될 것입니다. (하지만 너무 많은 세부 사항으로 질문을하고 싶지는 않았습니다.) 요점은 정말, 내가 여분의 논리를하기 위해 PHP 클래스로 돌아갈 필요가 있다는 것입니다. Smarty에서이 작업을 수행하는 방법을 알고 있지만 Twig의 철학은 약간 다릅니다. – cartbeforehorse
아마도 하위 컨트롤러가 어떻게 구현되는지 이해할 수 없을 것입니다. 그것이 모두 내부적으로 이루어 졌다면, 생각만큼 나쁘지는 않습니다. 나는 이것이 그것이 어떻게 작동 하는지를 받아 들일 필요가있다. – cartbeforehorse
나뭇 가지가 스마티와 다릅니다. 둘 다 사용하면 나뭇 가지에 투표합니다. 나뭇 가지 확장에서 데이터베이스 호출을 할 수 있지만 거의 확실하게 하위 컨트롤러를 사용하려고합니다. 이것은 : http://symfony.com/doc/current/components/http_kernel/introduction.html이 다소 압도적 일지 모르지만 맨 아래까지 스크롤하면 하위 요청이 설명됩니다. – Cerad