2015-07-28 41 views
1

我從CakePHP的2.x的移動把CakePHP 3.XCakePHP的3.X非默認視圖文件擴展名

在CakePHP 2.x中,在我的ApiController我可以做這樣的事情:

public function getScript(){ 
    $this->layout = 'empty'; 
    $this->ext = '.js'; 
} 

上面的代碼會呈現以下幾種觀點:

查看/原料藥/ get_script.js (請注意擴展名爲.js)

如何使用CakePhp 3.x實現相同的行爲?

我的文檔閱讀:

The Controller::$ext property has been removed. You now have to extend and override the View::$_ext property if you want to use a non-default view file extension.

但我不知道如何以及在何處延伸查看:: $ _分機財產

我試過如下:

我在中創建了一個新的View類src/View/ApiView.php

namespace App\View; 

use Cake\View\View; 

class ApiView extends View 
{ 
    protected $_ext = '.js';  
} 

而且在我的控制器:

public function getScript(){ 

     $this->viewClass='Api'; 
     $this->layout = 'ajax'; 


    } 

但現在我得到以下錯誤:

Error: The layout file Layout/ajax.js can not be found or does not exist.

這非常有意義,因爲我告訴CakePHP中使用的.js作爲默認的擴展名。但是我想爲模板視圖使用.ctp擴展名和.js擴展名。

在CakePHP 2.x中這麼簡單我相信CakePHP3.x中也必須有一個簡單的解決方案..請大家幫忙!

謝謝

+0

這意味着通過創建'WhateverView' - 並使用該類。 – AD7six

+0

這就是我想要做的..但我不能覆蓋_ext屬性(它不起作用),我需要一些示例代碼 – Franz

+0

如果你有一些示例代碼把它放在問題 - 這似乎不太可能你'按照說明書的建議去做。 – AD7six

回答

2

使用模板擴展你相反的可能想要使用RequestHandlerComponent來進行內容類型的協商。這可以讓你使用像Template/Api/js/action.ctp這樣的目錄。我發現這有助於將API的各種響應格式保持乾淨,因爲具有許多操作的控制器不會以蔓延的視圖文件列表結束。

要回答您的原始問題,您不能僅更改模板的擴展名,也不能更改默認視圖類的佈局。如果你想要這種行爲,你需要一個自定義視圖類。看看_getViewFileName_getLayoutFileName,在子類中覆蓋哪些方法。

3

你不能有你的蛋糕,吃它(太)! $_ext屬性用於所有模板類型(動作,元素,佈局),它的用法被隱藏在各種不同的地方,所以改變這個選擇有點乏味。

您最好的選擇很可能會重寫View::_getViewFileName()並暫時更改擴展名,這是不是很漂亮,但我腦海侵入性最小的解決方案現在:

protected function _getViewFileName($name = null) 
{ 
    $oldExt = $this->_ext; 
    $this->_ext = '.js'; 
    $filename = parent::_getViewFileName($name); 
    $this->_ext = $oldExt; 
    return $filename; 
}