2013-08-25 3 views
1

내 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 요청을 생성한다고 가정했습니다. 필자에게 이것은 일종의 응답 오류가 발생할 확률이 증가하는 것은 말할 것도없이 상당한 간접비를 의미하는 것으로 보입니다. 그러나 어쩌면 나는 틀을 오해 해왔다.

답변

0

나는 모든 점을 이해하고 있는지 잘 모르겠다.

당신은 확실히 app_bar 템플릿을하고 기본 템플릿에 포함 할 수 있습니다

{% if is_granted('ROLE_ADMINx') %} 
    <li><a href="{{ path('zayso_natgames_admin') }}">Admin</a></li> 
{% endif %} 

그것은 분명하지 않다

<body> 
    {{ include('@MyBundle/app_bar.html.twig') }} 
    {% block body %}{% endblock %} 
</body> 

당신은 확실히 사용자에 따라 app_bar에서 다른 항목을 표시 할 수 있습니다 어떤 다른 당신이 필요로하는 일종의 "비즈니스 로직". 간단한 조건문을 넘어서는 경우 나뭇 가지 확장에 코드를 넣을 수 있습니다.

내가 더 많이 필요하다는 인상을 받습니까? 아마 app_bar의 여러 유형? 나는 "각 네비게이션 바"가 특별한 것을 필요로한다는 것을 이해하지 못합니다.

하위 컨트롤러 구현 방법에 대한 오해가있을 수 있습니다. 하위 컨트롤러 요청은 내부적으로 수행됩니다. 브라우저로 왕복하지 않습니다. 성능에 미치는 영향은 미미합니다. 여러 개의 URL이 필요하지 않고 하나의 route_app_bar 만 있습니다.

물론 나는 완전히 질문을 오해하지 않는 한.

+0

"비즈니스 로직"에는 아마도 데이터베이스 호출이 포함될 것입니다. (하지만 너무 많은 세부 사항으로 질문을하고 싶지는 않았습니다.) 요점은 정말, 내가 여분의 논리를하기 위해 PHP 클래스로 돌아갈 필요가 있다는 것입니다. Smarty에서이 작업을 수행하는 방법을 알고 있지만 Twig의 철학은 약간 다릅니다. – cartbeforehorse

+0

아마도 하위 컨트롤러가 어떻게 구현되는지 이해할 수 없을 것입니다. 그것이 모두 내부적으로 이루어 졌다면, 생각만큼 나쁘지는 않습니다. 나는 이것이 그것이 어떻게 작동 하는지를 받아 들일 필요가있다. – cartbeforehorse

+1

나뭇 가지가 스마티와 다릅니다. 둘 다 사용하면 나뭇 가지에 투표합니다. 나뭇 가지 확장에서 데이터베이스 호출을 할 수 있지만 거의 확실하게 하위 컨트롤러를 사용하려고합니다. 이것은 : http://symfony.com/doc/current/components/http_kernel/introduction.html이 다소 압도적 일지 모르지만 맨 아래까지 스크롤하면 하위 요청이 설명됩니다. – Cerad

관련 문제