2016-11-21 3 views
0

데이터베이스에서로드해야하는 항목이 3 개인 큰 정적 메인 메뉴가 있습니다. 이러한 항목은 다차원 배열에 있으므로 각 항목마다 3x 선택 = 3x 다중 배열을 선택해야하는 자체 자식이 있습니다.Symfony 3 - 번들이없는 메뉴

이 항목을 선택하는 것이 빠르고 쉽기 때문에 번들을 필요로하지 않습니다. (+ 그것은 비표준 db 구조를 가진 프로젝트이므로 번들은 더 어려울 수 있습니다.)

그러나 저는 Symfony에서 새롭기 때문에 제 질문은 어떻게 한 곳에서 db의 메뉴 항목을로드 할 수 있는지 보여줍니다. ? 모든 컨트롤러/메소드에서이 항목을로드하고 싶지 않습니다. 내가 그것을 반복하고 PHP 클래스에서 HTML 문자열을 구축해야 할이 배열을 얻을 ... 나는 그것이 아주 나쁜 아이디어라고 생각 후 이미 메이크업 나뭇 가지 확장을 시도했지만하고

...

답변

1

나뭇 가지 확장 올바른 방법입니다 여기에 갈거야. 하지만 PHP에서 html 문자열을 만들 필요는 없습니다 (실제로 잘못된 것입니다). 확장 클래스 내에서 Twig 템플릿을 렌더링 할 수 있습니다.

예제 코드 :

<?php 
namespace AppBundle\Twig; 

class MenuExtension extends \Twig_Extension 
{ 

    public function __construct() //suitable dependecies here - probably Doctrine 
    { 
     //assign params to class properties 
    } 

    public function getName() 
    { 
     return 'menu_extension'; 
    } 

    public function getFunctions() 
    { 
     return [ 
      new \Twig_SimpleFunction('menuRenderer', [$this, 'menuRenderer'], [ 
       'needs_environment' => true, 
       'is_safe' => ['html'] 
      ]) 
     ]; 
    } 

    public function menuRenderer(\Twig_Environment $environment) 
    { 
      //do all the work to get data from DB 

      return $environment->render('AppBundle:Menu:main-menu.html.twig', array(
       //pass data to template 
     )); 
    } 
} 
+1

"나뭇 가지 확장 여기 올바른 방법입니다." 아키텍처에 대한 귀하의 비전에 달려 있습니다. 템플릿에 로직을 넣는 것이 좋으면 OK입니다. 그러나 템플릿을 유지하는 데 너무 많은 로직을 넣고 싶지 않다면 올바른 구조의 사전 처리 된 배열이나 객체를 주입하는 것이 좋습니다. –

+0

항상 달라집니다. ;-) 비즈니스 논리를 처리 할 서비스를 삽입 할 수도 있습니다. 하지만 저장소가 아닌 논리에 대한 호출 findAll 일뿐입니다. –

+0

방금 ​​내 의견에 오타가 있음을 눈치 채 셨습니다. "유지 관리가 더 쉬워졌습니다."-> "** 유지 관리가 더 쉬워졌습니다." –