渲染期间应用程序区域设置加密的未知原因?
Unknown Reason for App Locale Encrypted During Render?
我遇到了一个不寻常的问题。
我有一个多租户 Laravel 应用程序,它使用 app()->setLocale() 为租户设置默认语言环境
当我在 view/controller 中为任何租户或根应用程序获取语言环境时,我会得到一个加密的字符串,如下所示:
eyJpdiI6ImtMdFI5Q05KSkU0WlJGaG9HUnF4K2c9PSIsInZhbHVlIjoic3ZVXC90SzVRRjBhUkpQdHJmcHNDUlE9PSIsIm1hYyI6IjE3MDQ4MjBiYTg0YzgwMWRmZmZlMTYxN2EwNDkwODE2MGJmZTNmNDJjOTAwYmE0ZGVlOWY0Yjc4YjIyNmEyMTAifQ==
但是如果我在设置它之后立即从 AppServiceProvider 获取它,我的正确结果如下:
en_AU
我的composer.json:
"require": {
"php": "^7.2",
"appstract/laravel-options": "^2.2",
"fideloper/proxy": "^4.0",
"laravel/framework": "^6.2",
"laravel/passport": "^7.5",
"laravel/telescope": "^2.1",
"laravel/tinker": "^1.0",
"spatie/laravel-activitylog": "^3.9",
"spatie/laravel-query-builder": "^2.3",
"spatie/laravel-schemaless-attributes": "^1.6",
"spatie/laravel-sluggable": "^2.2",
"spatie/laravel-translatable": "^4.2",
"stancl/tenancy": "^2.1"
},
"require-dev": {
"ahuggins/open-on-make": "^0.0.37",
"ajthinking/tinx": "^2.6",
"facade/ignition": "^1.4",
"fzaninotto/faker": "^1.4",
"laravel/homestead": "^9.2",
"laravel/ui": "^1.1",
"mockery/mockery": "^1.0",
"nunomaduro/collision": "^3.0",
"phpunit/phpunit": "^8.0"
}
我的 AppServiceProvider 启动包含更改时区和区域设置的代码:
Tenancy::hook('bootstrapped', function ($tenantManager) {
if (Schema::hasTable('options')) {
// Set Tenant Timezone
if (option_exists('timezone')) {
$timezone = option('timezone');
config(['app.timezone' => $timezone]);
date_default_timezone_set($timezone);
}
// Set Tenant Local
logger('Option: ' . option('locale', 'en'));
app()->setLocale(option('locale', 'en'));
logger('App: ' . app()->getLocale());
}
});
Tenancy::hook('ended', function ($tenantManager) {
if (Schema::hasTable('options')) {
// Reset Timezone
$timezone = env('APP_TIMEZONE', 'Australia/Adelaide');
config(['app.timezone' => $timezone]);
date_default_timezone_set($timezone);
//Reset Local
app()->setLocale(env('APP_LOCALE', 'en_AU'));
}
});
我试过这么简单的路线:
Route::get('', function () {
return app()->getLocate();
}
仍然没有运气
我也试过:
- 移除 AppServiceProvider 中的上述代码
- 全新 Laravel 安装并安装了所有相同的软件包,并设法使用 ahiggins/open-on-make 的 install/uninstall 重新创建了一次。
好的,事实证明问题出在我创建的用于将用户语言选项保存到 cookie 值的中间件上。
问题是,如果不存在,我将语言设置为 false,因此设置了长字符串。
每次用户加载页面时,中间件都会抓取这个值。
我遇到了一个不寻常的问题。
我有一个多租户 Laravel 应用程序,它使用 app()->setLocale() 为租户设置默认语言环境
当我在 view/controller 中为任何租户或根应用程序获取语言环境时,我会得到一个加密的字符串,如下所示:
eyJpdiI6ImtMdFI5Q05KSkU0WlJGaG9HUnF4K2c9PSIsInZhbHVlIjoic3ZVXC90SzVRRjBhUkpQdHJmcHNDUlE9PSIsIm1hYyI6IjE3MDQ4MjBiYTg0YzgwMWRmZmZlMTYxN2EwNDkwODE2MGJmZTNmNDJjOTAwYmE0ZGVlOWY0Yjc4YjIyNmEyMTAifQ==
但是如果我在设置它之后立即从 AppServiceProvider 获取它,我的正确结果如下:
en_AU
我的composer.json:
"require": {
"php": "^7.2",
"appstract/laravel-options": "^2.2",
"fideloper/proxy": "^4.0",
"laravel/framework": "^6.2",
"laravel/passport": "^7.5",
"laravel/telescope": "^2.1",
"laravel/tinker": "^1.0",
"spatie/laravel-activitylog": "^3.9",
"spatie/laravel-query-builder": "^2.3",
"spatie/laravel-schemaless-attributes": "^1.6",
"spatie/laravel-sluggable": "^2.2",
"spatie/laravel-translatable": "^4.2",
"stancl/tenancy": "^2.1"
},
"require-dev": {
"ahuggins/open-on-make": "^0.0.37",
"ajthinking/tinx": "^2.6",
"facade/ignition": "^1.4",
"fzaninotto/faker": "^1.4",
"laravel/homestead": "^9.2",
"laravel/ui": "^1.1",
"mockery/mockery": "^1.0",
"nunomaduro/collision": "^3.0",
"phpunit/phpunit": "^8.0"
}
我的 AppServiceProvider 启动包含更改时区和区域设置的代码:
Tenancy::hook('bootstrapped', function ($tenantManager) {
if (Schema::hasTable('options')) {
// Set Tenant Timezone
if (option_exists('timezone')) {
$timezone = option('timezone');
config(['app.timezone' => $timezone]);
date_default_timezone_set($timezone);
}
// Set Tenant Local
logger('Option: ' . option('locale', 'en'));
app()->setLocale(option('locale', 'en'));
logger('App: ' . app()->getLocale());
}
});
Tenancy::hook('ended', function ($tenantManager) {
if (Schema::hasTable('options')) {
// Reset Timezone
$timezone = env('APP_TIMEZONE', 'Australia/Adelaide');
config(['app.timezone' => $timezone]);
date_default_timezone_set($timezone);
//Reset Local
app()->setLocale(env('APP_LOCALE', 'en_AU'));
}
});
我试过这么简单的路线:
Route::get('', function () {
return app()->getLocate();
}
仍然没有运气
我也试过:
- 移除 AppServiceProvider 中的上述代码
- 全新 Laravel 安装并安装了所有相同的软件包,并设法使用 ahiggins/open-on-make 的 install/uninstall 重新创建了一次。
好的,事实证明问题出在我创建的用于将用户语言选项保存到 cookie 值的中间件上。
问题是,如果不存在,我将语言设置为 false,因此设置了长字符串。
每次用户加载页面时,中间件都会抓取这个值。