我猜測它沒有完成,因爲我無法在任何地方找到任何引用,即使是沒有迴應的人也會問。儘管我希望Symfony稱之爲別的東西。如何在Symfony中創建自定義文件
我怎樣才能得到的Symfony自動呈現views/{controller}/{action}.html.php
我猜測它沒有完成,因爲我無法在任何地方找到任何引用,即使是沒有迴應的人也會問。儘管我希望Symfony稱之爲別的東西。如何在Symfony中創建自定義文件
我怎樣才能得到的Symfony自動呈現views/{controller}/{action}.html.php
@ meze的答案比開箱即用的行爲更令人滿意。
然而,我認爲他指給我的SensioFrameworkExtraBundle給了我線索,我需要實現這一點而不必更換我自己的路線。
這是鉤入kernel view event。
其目的,具體陳述爲:
事件的目的是允許一些其它返回值被轉換成一個響應。
我假設它可以用來將控制器操作的空返回值轉換爲響應。
不,它在Symfony的標準版是不可能的。但是,路由只是其中的一個components。所以如果你真的想要的話,你可以創建你自己的組件並使用它。
你有兩個選擇:
1)使用SensioFrameworkExtraBundle - 它允許使用@Template註解。 (它包含在SE中)。
2)寫你自己的方法。我發現它煩人寫@Template和控制器每一次,所以我說的基本控制器這種方法的任何註釋(這只是一個例子,在生產中使用它之前檢查):在控制器
public function view(array $parameters = array(), Response $response = null, $extension = '')
{
$extension = !empty($extension) ? $extension : $this->templateExtension;
$view = ViewTemplateResolver::resolve($this->get('request')->get('_controller'), get_called_class());
return $this->render($view . '.' . $extension, $parameters, $response);
}
class ViewTemplateResolver
{
public static function resolve($controller, $class)
{
$action = preg_replace('/(.*?:|Action$)/', '', $controller);
if (preg_match('~(\w+)\\\\(\w+Bundle).*?(\w+(?=Controller$))~', $class, $name)) {
return implode(':', array($name[1] . $name[2], $name[3], $action));
}
}
}
現在我們可以這樣做:return $this->view();
當您使用批註而不是yaml進行路由時,您可以將@Template()
添加到您的操作方法中,並且它會根據您的要求呈現默認模板。
要做到這一點,你的路由更改爲註釋:
AcmeDemoBundle:
resource: "@PAcmeDemoBundle/Controller/"
type: annotation
prefix:/
在你的控制器,這增加每個動作:
/**
* @Route("/index", name="demo_index")
* @Template()
*/
其實我不知道是否有辦法不使用註釋時獲得此行爲。但是因爲似乎有邏輯,所以可能有一個。