2013-05-24 4 views
1

Я создаю веб-сайт, состоящий из нескольких приложений (я создал комплект для каждого из них) и ряд «semi static».Catch-all route for Twig templates

Эта полустатическая страница представляет собой шаблоны Twig, которым не нужен контроллер, поскольку они содержат только HTML-код, а в некоторых случаях - {% extends %}, чтобы использовать определенный шаблон и {% if is_granted('ROLE_ADMIN') %}, чтобы показывать определенный контент только администраторам.

Я знаю о контроллере FrameworkBundle:Template:template, который представил Symfony 2.1, но я не могу использовать его, потому что и я не могу добавить маршрут для каждой «статической» страницы, создаваемой дизайнером.

Кроме того, URL-адреса этих статических страниц могут содержать один или несколько подкаталогов (/ один,/один/два,/один/два/три ...), поэтому я придумал это решение, где, если дизайнер хочет URL-адрес mywebsite.com/part1/part2/part3, он сохранит представления в StaticBundle/Resources/views/part1/part2/part3.html.twig, и контроллер сгенерирует путь NectStaticBundle: по умолчанию: part1/part2/part3 .html.twig

/** 
* @Route("/{part1}") 
* @Route("/{part1}/{part2}") 
* @Route("/{part1}/{part2}/{part3}") 
* @Route("/{part1}/{part2}/{part3}/{part4}") 
* @Route("/{part1}/{part2}/{part3}/{part4}/{part5}") 
*/ 
public function proxyAction($part1='', $part2='', $part3='', $part4='', $part5='') { 
    $parameters = func_get_args(); 
    $parts = array_filter($parameters, 'trim'); 


    $templatePath = "NectStaticBundle:Default"; 
    for($i = 0; $i < count($parts) - 1; $i++) { 
     if($dir = $parts[$i]) 
      $templatePath .= "/$dir"; 
    } 
    $name = $parts[$i]; 
    $templatePath .= "/$name.html.twig"; 
    $templatePath = preg_replace("/\//", ':', $templatePath, 1); 


    $response = $this->container->get('templating')->renderResponse($templatePath); 
    return $response; 
} 

Я знаю, что это большой уродливый рубить и он сосет, так что мне было интересно, если кто-то знает лучший способ для достижения этой цели.

+0

пожалуйста рассмотреть мой ответ и комментарий, если что-то не хватает/не работает - в противном случае принять пожалуйста :) – nifr

ответ

0
/** 
* @Route("/{part1}/{part2}/{part3}/{part4}/{part5}") 
*/ 
public function proxyAction($part1=null, $part2=null, $part3=null, $part4=null, $part5=null) 
{ 
     $parts  = array_filter(array($part1, $part2, $part3, $part4, $part5), 'is_null'); 
     $template  = array_pop($parts); 
     $templatePath = 'NectStaticBundle:Default/' .implode("/", $parts) . '/' . $template . '.html.twig'; 

     $response = $this->container->get('templating')->renderResponse($templatePath); 
return $response; 
    } 

Не тестировался, но в любом случае .. Вы получаете идею :)