【问题标题】:CakePhp 3.x non-default view file extensionCakePhp 3.x 非默认视图文件扩展名
【发布时间】:2015-10-18 20:36:29
【问题描述】:

我从 CakePhp 2.x 迁移到 CakePhp 3.x

在 CakePhp 2.x 中,在我的 ApiController 中,我可以这样做:

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

上面的代码会呈现以下视图:

查看/Api/get_script.js (请注意 .js 扩展名)

如何使用 CakePhp 3.x 实现相同的行为?

我在文档中读到:

Controller::$ext 属性已被移除。如果要使用非默认视图文件扩展名,现在必须扩展和覆盖 View::$_ext 属性。

但我不明白如何以及在何处扩展 View::$_ext 属性

我尝试了以下方法:

我在 src/View/ApiView.php 中新建了一个 View 类

namespace App\View;

use Cake\View\View;

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

在我的控制器中:

public function getScript(){

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


    }

但现在我收到以下错误:

错误:布局文件 Layout/ajax.js 找不到或没有 存在。

这很有意义,因为我告诉 CakePhp 使用 .js 作为默认扩展名。但我想为布局使用 .ctp 扩展名,为模板视图使用 .js 扩展名。

在 CakePHP 2.x 中它是如此简单我相信在 CakePHP3.x 中也一定有一个简单的解决方案..请帮助!

谢谢

【问题讨论】:

  • 这意味着通过创建WhateverView - 并使用该类。
  • 这就是我想要做的......但我无法覆盖 _ext 属性(它不起作用),我需要一些示例代码
  • 如果您有一些示例代码,请将其放在问题中 - 您似乎不太可能按照说明的建议进行操作。
  • 我尝试了不同的方法。我已经编辑了问题并添加了迄今为止给出最接近解决方案的代码。但我仍然没有得到我想要的..

标签: php cakephp cakephp-3.0


【解决方案1】:

你不能吃你的蛋糕(也)! $_ext 属性被用于所有模板类型(动作、元素、布局),并且它的使用隐藏在不同的地方,因此将其更改为有选择地使用有点乏味。

您最好的选择可能是覆盖 View::_getViewFileName() 并临时更改扩展名,这不是很好,但我现在想到的侵入性最小的解决方案:

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

【讨论】:

    【解决方案2】:

    您可能希望使用 RequestHandlerComponent 进行内容类型协商,而不是使用模板扩展。这将允许您使用像Template/Api/js/action.ctp 这样的目录。我发现这有助于保持 API 的各种响应格式干净,因为具有许多操作的控制器不会以庞大的视图文件列表结束。

    要回答您的原始问题,您不能仅更改模板的扩展名,而不能更改具有默认视图类的布局。如果您想要这种行为,您将需要一个自定义视图类。查看_getViewFileName_getLayoutFileName 在子类中覆盖哪些方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 2014-05-07
      • 2015-01-20
      相关资源
      最近更新 更多