CakePhp 3.x 非默认视图文件扩展名
CakePhp 3.x non-default view file extension
我从 CakePhp 2.x 转移到 CakePhp 3.x
在 CakePhp 2.x 中,在我的 ApiController 中我可以这样做:
public function getScript(){
$this->layout = 'empty';
$this->ext = '.js';
}
以上代码将呈现以下视图:
View/Api/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::$_ext 属性
我尝试了以下方法:
我在 src/View/ApiView 中创建了一个新视图 class。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 我相信在 CakePHP 中也一定有一个简单的解决方案3.x..请帮忙!
谢谢
你不能吃你的蛋糕(也)! $_ext
属性 用于所有模板类型(操作、元素、布局),它的用法隐藏在各种不同的地方,因此将其更改为有选择地使用有点乏味。
您最好的选择可能是覆盖 View::_getViewFileName()
并暂时更改扩展名,这不是很好,但我现在想到的侵入性最小的解决方案:
protected function _getViewFileName($name = null)
{
$oldExt = $this->_ext;
$this->_ext = '.js';
$filename = parent::_getViewFileName($name);
$this->_ext = $oldExt;
return $filename;
}
您可能不希望使用模板扩展,而是考虑使用 RequestHandlerComponent 进行内容类型协商。这将允许您使用像 Template/Api/js/action.ctp
这样的目录。我发现这有助于保持 API 的各种响应格式干净,因为具有许多操作的控制器不会以庞大的视图文件列表结束。
要回答您最初的问题,您不能仅更改模板的扩展名,而不能更改默认视图的布局 class。如果您想要那种行为,您将需要一个自定义视图 class。查看 _getViewFileName and _getLayoutFileName 在子 class.
中覆盖哪些方法
我从 CakePhp 2.x 转移到 CakePhp 3.x
在 CakePhp 2.x 中,在我的 ApiController 中我可以这样做:
public function getScript(){
$this->layout = 'empty';
$this->ext = '.js';
}
以上代码将呈现以下视图:
View/Api/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::$_ext 属性
我尝试了以下方法:
我在 src/View/ApiView 中创建了一个新视图 class。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 我相信在 CakePHP 中也一定有一个简单的解决方案3.x..请帮忙!
谢谢
你不能吃你的蛋糕(也)! $_ext
属性 用于所有模板类型(操作、元素、布局),它的用法隐藏在各种不同的地方,因此将其更改为有选择地使用有点乏味。
您最好的选择可能是覆盖 View::_getViewFileName()
并暂时更改扩展名,这不是很好,但我现在想到的侵入性最小的解决方案:
protected function _getViewFileName($name = null)
{
$oldExt = $this->_ext;
$this->_ext = '.js';
$filename = parent::_getViewFileName($name);
$this->_ext = $oldExt;
return $filename;
}
您可能不希望使用模板扩展,而是考虑使用 RequestHandlerComponent 进行内容类型协商。这将允许您使用像 Template/Api/js/action.ctp
这样的目录。我发现这有助于保持 API 的各种响应格式干净,因为具有许多操作的控制器不会以庞大的视图文件列表结束。
要回答您最初的问题,您不能仅更改模板的扩展名,而不能更改默认视图的布局 class。如果您想要那种行为,您将需要一个自定义视图 class。查看 _getViewFileName and _getLayoutFileName 在子 class.
中覆盖哪些方法