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.

中覆盖哪些方法