我正在创建一个网站,其中包含多个应用程序(我为每个应用程序创建了一个包)和一些“半静态”页面。
这个半静态页面是Twig模板,它们不需要控制器,因为它们只包含HTML代码,在某些情况下{% extends %}
使用某个模板而{% if is_granted('ROLE_ADMIN') %}
只向管理员显示某些内容
我知道Symfony 2.1引入的FrameworkBundle:Template:template
控制器,但我不能使用这个,因为我不能为设计师创建的每个“静态”页面添加路由。
此外,这些静态页面的URL可能有一个或多个子目录(/ one,/ one / two,/ one / two / three ......)所以我提出了这个解决方案,如果设计师需要URL为mywebsite.com/part1/part2/part3,他将视图存储在StaticBundle / Resources / views / part1 / part2 / part3.html.twig中,控制器将生成路径NectStaticBundle:Default: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 :(得分: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;
}
未经测试但无论如何......你明白了这一点:)