动态设置错误动作的布局文件

2024-01-08

我知道有不同的方法来选择布局文件。可以办到

  • 在配置中
  • with Yii::$app->layout = '...'
  • with Controller::$layout

我有一些使用不同布局文件的控制器,如下所示:

class FirstController extends yii\web\Controller {
    public $layout = 'firstLayout';
    ...
}

class SecondController extends yii\web\Controller {
    public $layout = 'secondLayout';
    ...
}

现在我有了 Yii2 中默认的错误处理。所以有一个配置设置'errorHandler' to 'site/error'(这是一个全局错误处理程序)。还有 SiteController

class SiteController extends yii\web\Controller {
    public function actions() {
        return [
            'error'   => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }
    ...
}

我的问题错误处理程序默认使用 SiteController 的布局文件。但它应该是实际调用的控制器中的那个。我怎样才能实现这个目标动态地?


它可以在应用程序事件中设置:

$config = [
    'id'              => 'my-app',
    'basePath'        => dirname(__DIR__),
    'params'          => ...
    'bootstrap'       => ['log'],
    'components'      => [
        ...
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        ...
    ],

    'on beforeAction' => function (yii\base\ActionEvent $e) {
        if ($e->action->id === 'error' && $e->action->controller->id === 'site') {
            // this is the second step
            if (isset(Yii::$app->params['requested-layout']))
                $e->action->controller->layout = Yii::$app->params['requested-layout'];
        } else {
            // this happens first
            Yii::$app->params['requested-layout'] = $e->action->controller->layout;
        }
    },
];

会发生什么:请注意,如果操作中抛出异常,则 beforeAction 会被调用两次。第二次调用是由错误处理程序引起的。现在,在每个常规请求中,当前布局都会存储在某处(我使用了全局可用的Yii 参数 http://www.yiiframework.com/doc-2.0/guide-structure-applications.html#params为了这)。如果由于某种原因需要调用错误处理程序,则包含错误操作控制器的布局文件将被采用到存储的布局文件中。

开放式问题:

  • 不考虑模块。需要更多逻辑。
  • 'on beforeAction' http://www.yiiframework.com/doc-2.0/guide-structure-applications.html#beforeAction被呼叫并且Yii::$app->params['requested-layout']将被设置only对于现有的操作和控制器(和模块)以及操作方法中引发的异常。
  • 如果路由无效或发生其他错误,将直接调用 beforeAction 处理程序site/error without之前执行它。因此布局文件没有被采用(可以通过实现来解决'on beforeRequest')并且将使用默认布局(可以是真正的默认布局,也可以以不同的方式设置(例如 SiteController 的 $layout 属性)。
  • 如果布局文件不在一个文件夹中(在中定义),则可能需要更多逻辑Application::$layoutFiles http://www.yiiframework.com/doc-2.0/yii-base-module.html#%24layoutPath-detail).

我认为通过扩展这条线(未测试)也可以轻松地考虑该模块:

Yii::$app->params['requested-layout'] = $e->action->controller->layout ?: 
                                        $this->action->controller->module->layout;

让我知道这是否合理或错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态设置错误动作的布局文件 的相关文章

  • ASP.NET MVC 2 - POST 后 ViewData 为空

    我真的不知道在哪里寻找错误 情况 我有一个 ASPX 视图 其中包含一个表单和一些输入 当我单击 提交 按钮时 所有内容都会 POST 到我的一个 ASP NET MVC 操作 当我在那里设置断点时 它被正确命中 当我使用 FireBug
  • 在 Spring 中,为什么 POJO 上的 CGLib 的行号会丢失?

    Spring MVC Web 应用程序 我有一个不带行号的堆栈跟踪 显示在底部 我认为这是由于 CGLib 在控制器上运行所致 但这对我来说很奇怪 实际的异常发生在ServerBatchRemoteRequestAcceptor 一个没有注
  • Debian - /usr/bin/env: 'php\r': 没有这样的文件或目录

    所以当我跑步时 直接讨论问题 yii似乎我从 Debian stretch 中收到了从 Docker 运行的错误 然而当我跑步时 usr bin env php v我得到了正确的输出 没有问题 似乎新行被翻译为字符串时出现问题 我不知道如何
  • Node.js (Express) 带有路由器的错误处理中间件

    这是我的应用程序结构 app js routes index js The ExpressJS应用程序创建错误处理程序development and production环境 这是来自的代码片段app js app use routes r
  • Yii框架2.0添加媒体打印到css链接

    使用 Yii 框架 2 0 我包含一个 css 文件 其中包含以下代码资产 AppAsset php public css css style css 当我在网络浏览器上检查元素时 我在标题标记中看到以下代码 我想添加打印 css到网页媒体
  • PHP - 停止显示错误中的完整路径

    有什么方法可以告诉 PHP 不显示错误 警告或通知消息中存在任何错误的文件的完整路径 我知道我可以禁用错误 但是 只是为了避免任何风险 例如 我的脚本返回一个错误 显示如下 Fatal error Call to undefined fun
  • 如何在 netsuite 中使用 suitescript 2.0 显示自定义错误消息而不使用堆栈跟踪

    我想使用 suitescript 2 0 版本向用户显示没有堆栈跟踪的自定义错误消息 在工作流程中 自定义错误消息在没有堆栈跟踪的情况下显示 但在套件脚本中 错误消息 与堆栈跟踪一起显示 堆栈跟踪错误 type error SuiteScr
  • 如何在node-mysql查询后获取警告

    如何获取查询执行后识别的相应警告 如下所示 connection query squery function err rows search for OkPacket in 2 dimension array var warningCoun
  • Kubernetes Pod 动态环境变量

    我需要能够将自定义环境变量分配给 Pod 的每个副本 一个变量应该是一些随机的 uuid 另一个唯一的数字 怎么可能实现呢 我更愿意继续使用带有副本的 部署 如果这不是开箱即用的 如何通过自定义复制控制器 控制器管理器来实现 有没有可用的钩
  • PHP 构造函数返回 NULL

    我有这个代码 是否有可能User对象构造函数以某种方式失败 以便 this gt LoggedUser被分配了一个NULL构造函数返回后值和对象被释放吗 this gt LoggedUser NULL if SESSION verbiste
  • 如何处理 Primefaces 延迟加载中的错误?

    我无法让用户知道发生的异常PrimeFaces http primefaces org LazyDataModel load方法 我正在从数据库加载数据 当引发异常时 我不知道如何通知用户 我尝试添加FacesMessage to Face
  • 您将如何整理这个控制器逻辑?

    我在控制器中有一些逻辑 如果满足某些条件 它会设置对象的状态 if params concept consulted legal 0 params concept consulted marketing 1 concept attribut
  • 2015 年重新审视 Ember Handling 401

    我可以在 Ember Ember Data 中找到大量询问 回答如何从 Rails 后端处理 401 的老问题 许多 如果不是全部的话 在这一点上似乎已经过时了 我已经尝试了我能找到的一切 Ember 数据处理 401 https stac
  • 在 try 中使用零合并运算符? for 抛出并返回可选值的函数

    我想在以下两种情况下使用 nil coalescing 运算符设置默认值 函数抛出错误 函数返回 nil 请看一下下面的代码片段 我有以下问题 为什么 item1 为零 item1和item2的初始化有什么区别 enum VendingMa
  • 从 Yii2 中的联结表检索数据

    我试图从 Yii2 中的连接表获取数据无需额外查询 我有 2 个模型 用户 组 通过连接表 user group 关联 在 user group 表中 我想存储此关系的额外数据 管理标志 将数据添加到连接表的最佳方法是什么 link 方法接
  • 使用 WF 的多线程应用程序的错误处理模式?

    我正在写一个又长又详细的问题 但只是放弃了它 转而选择一个更简单的问题 但我在这里找不到答案 应用程序简要说明 我有一个 WPF 应用程序 它生成多个线程 每个线程执行自己的 WF 处理线程和 WF 中的错误 允许用户从 GUI 端进行交互
  • 从远程托管上的 PHP 获取 PHP 错误日志

    是否有 PHP 函数或其他方式以字符串形式获取 PHP 错误日志 我需要这个 因为我无法访问在其他人的服务器上运行的站点的错误日志 他提出通过电子邮件将错误日志发送给我 但这不太方便 有什么方法可以将错误日志输出到 PHP 页面吗 我意识到
  • 为什么我不能将左大括号放在下一行?

    当我尝试编译以下代码时遇到奇怪的错误 package main import fmt fmt func main var arr 3 int for i 0 i lt 3 i fmt Printf d arr i 错误如下 unexpect
  • 如何在输入错误的情况下回滚 gridview 中的更改

    我有一个绑定到对象列表的 DataGridView 它有一些用户可以编辑的列 某些输入对于整个行来说是不允许的 如果用户在某些单元格中输入无效输入 我该如何回滚 我尝试使用 RowValidating 事件处理程序 但在更改单元格值后未调用
  • 如何为 ApplicationController 中 after_action 过滤器中的所有操作渲染 json?

    是否可以在 Rails ApplicationController 中创建一个 after filter 方法 该方法在每个操作上运行并呈现为 JSON 我正在构建一个 API 并且希望将控制器中的每个操作的输出呈现为 JSON 客户控制器

随机推荐

  • 设置Python的collections.defaultdict的默认字符串值

    我正在使用 Python 3 2 3 并且想要更改默认返回的字符串值 from collections import defaultdict d defaultdict str d NonExistent 返回的值为 我怎样才能改变这个 以
  • 如何在 Roblox 中打开和关闭 gui?

    我正在 Roblox 中制作游戏 但遇到了错误 我正在尝试制作在游戏中打开商店的 GUI 按钮 但它打不开 我试图使按钮不可见而商店可见 一切工作正常 但图形用户界面不会变得可见 不可见 它表示 GUI 在属性中的可见性发生了变化 但在游戏
  • Kong:docker-compose [PostgreSQL错误]无法检索PostgreSQL server_version_num:未提供主机或服务,或未知

    我正在尝试学习如何使用Kong https konghq com 对于我的 API 服务器 但遇到了错误 kong 1 nginx error init by lua error usr local share lua 5 1 kong i
  • 存储库上的 Ninject WCF 垃圾收集

    我正在使用带有 WCF 扩展的 Ninject 2 2 在我的大多数服务中 存储库都会快速实例化 发布 但是 我的一项服务执行长时间运行的操作 2 3 分钟 如果我观察 w3wp 进程 我可以看到使用 SQL 建立的 TCP IP 连接 并
  • MVC4 使用什么加密?

    我们如何找出 MVC4 使用的加密方式 我注意到有一个 SALT 选项 但这似乎也没有在WebSecurity 模块 我想知道使用的标准以及是否可以轻松升级到最新的 SHA 根据下面的链接Default Hashing Algorithm
  • 广告激活有什么作用?

    In an answer https stackoverflow com a 8129994 357313 我注意到 Align with spaces only defadvice align regexp around align re
  • 如何在 Tensorflow.js 中获取预测值

    我正在尝试将预测系统构建到 MERN 应用程序中 我是 Tensorflow 新手 刚刚关注this https codelabs developers google com codelabs tfjs training regressio
  • 如何使用 Gradle 将 romainguy 的 ViewServer 包含在 Android Studio 中?

    我正在尝试使用 RomainGuy 的 ViewServer https github com romainguy ViewServer https github com romainguy ViewServer 我的 Android St
  • C 中的 Boost 类似库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您能否推荐我可以在 C 环境中使用的同行评审库 例如 Boost for C 提供哈希 线程 进程间通
  • 将数据从 Microsoft SQL Server 读取到 R 中

    是否可以从 R 接口读取 MS SQL Server 中存储的数据 如果是的话 如果有人能告诉我如何做到这一点 我也会很感激 尝试过RODBC已经打包了吗 http cran r project org web packages RODBC
  • MVC 授权属性拒绝

    我正在使用Authorize 属性来保护我的控制器 操作 并且只想向未经身份验证的用户显示登录操作 或者换句话说 拒绝对经过身份验证的用户的访问 我在网上找不到任何涉及拒绝权限或允许负面权限 即 LoggedIn 的内容 有人可以指出我正确
  • 让 ORMLite 对结构使用正确的序列化

    tl dr 我正在结构上注册序列化器和反序列化器 序列化器未被调用 但解串器被调用 我怎样才能解决这个问题 它适用于引用类型 并且执行JsConfig
  • 如何在 C# 中进行非阻塞套接字调用来确定连接状态?

    Socket 上 Connected 属性的 MSDN 文档说明如下 Connected 属性的值 反映连接的状态 截至最近一次操作 如果 你需要确定当前 连接状态 进行 非阻塞 零字节发送调用 如果 调用成功返回或 抛出 WAEWOULD
  • CefSharp 中的可拖动无边框窗口

    我想在某些 HTML 元素上实现带有拖动逻辑的无边框窗口 我找到了一些工作示例 例如适用于 Chrome 的无框窗口 https chrome google com webstore detail frameless window samp
  • iOS6 中的 CoreMIDI/PGMidi 虚拟 midi 错误

    面临两个错误 此代码在 iOS 4 和 5 中有效 但更新到 6 后 它不起作用 我发现了以下内容 但不知道如何在代码中修复它 从 iOS 6 开始 应用程序需要在其 UIBackgroundModes 中拥有音频键才能使用 CoreMID
  • Mvvm交叉绑定

    我尝试将小部件绑定到视图模型属性 但出现异常 MvxBind Warning 14 76 Failed to create target binding for binding Signature for Order ClientSigna
  • 创建 WCF 消息的缓冲副本

    我在消息检查器中有以下代码来检查响应正文 我知道 WCF 消息只能读取一次 因此我首先创建一个副本 但使用以下代码我仍然收到错误 此消息无法支持该操作 因为它已被读取 我错过了什么吗 MessageBuffer buffer message
  • Firefox 扩展自定义字体

    我正在使用 Firefox Add on SDK 创建扩展并执行 PageMod 这段代码位于main js exports main function var pageMod require sdk page mod pageMod Pa
  • django-allauth:模块“accounts.forms”未定义“SignupForm”类

    我收到以下错误 django core exceptions ImproperlyConfigured 模块 accounts forms 没有定义 SignupForm 类 设置 py ACCOUNT SIGNUP FORM CLASS
  • 动态设置错误动作的布局文件

    我知道有不同的方法来选择布局文件 可以办到 在配置中 with Yii app gt layout with Controller layout 我有一些使用不同布局文件的控制器 如下所示 class FirstController ext