gpt4 book ai didi

php - 根据数据库结果设置 Yii2 catchAll 路由

转载 作者:行者123 更新时间:2023-12-04 02:21:18 25 4
gpt4 key购买 nike

<?php

namespace app\modules\site\controllers;

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use app\models\SiteSettings;

class CommonController extends Controller {

public function init() {
Yii::$app->language = 'bg-BG';
Yii::$app->formatter->locale = 'bg-BG';
Yii::$app->params['siteSettings'] = SiteSettings::find()->one();

if (Yii::$app->params['siteSettings']->in_maintenance == 1) {
Yii:$app->catchAll = ['index/maintenance', 'message' => Yii::$app->params['siteSettings']->maintenance_message];
}
}

我试图从 CommonController init 方法中设置 catchAll 路由,但它抛出一个错误:

Creating default object from empty value

是否可以根据数据库提供的条件设置 catchAll 路由?

最佳答案

您需要在处理请求之前设置 catchAll 属性。 Init 方法是在resloving controller 之后执行的,所以不会有任何影响。您需要使用应用程序 onBeforeRequest 事件来设置 catchAll 路由。

在配置文件中设置如下:

$config = [
'id' => '...',
......

'on beforeRequest' => function () {
Yii::$app->params['siteSettings'] = SiteSettings::find()->one();
if (Yii::$app->params['siteSettings']->in_maintenance == 1) {
Yii::$app->catchAll = [
'index/maintenance',
'message' => Yii::$app->params['siteSettings']->maintenance_message
];
}
},
....
'comonents' = [
....
]
];

您可以通过缓存 SiteSettings::find()->one(); 对此做一些改进。以避免为每个请求打开与数据库的连接。

更新:我不确定 catchAll 是否可以用于特定模块,但您可以处理 onBeforeAction 事件并重定向到自定义路由。

'on beforeAction' => function ($event) {

$actionId = $event->action->id;
$controllerId = $event->action->controller->id;
$moduleId = $event->action->controller->module->id;

//TODO: Check module here
if (!(($controllerId == "site") && ($actionId == "offline")))
{
return Yii::$app->response->redirect(['site/offline']);
}
},

关于php - 根据数据库结果设置 Yii2 catchAll 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28975197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com