【已解决】使用 illuminate/validation 验证器无法支持中英文切换

jacknum1

插件版本

"php": ">=7.2",
"workerman/webman-framework": "^1.4.3",
"illuminate/validation": "^9.52",
"symfony/translation": "^6.0"

预期效果

采用APIPOST接口请求软件,通过传header参数accept-language实时更换语言

实际问题

采用locale()设置语言中间件,本地语言包完全可以切换,但是illuminate/validation插件无法实时切换语言,只能重启项目后生效,想大佬帮忙看看怎么回事
截图

程序代码

语言中间件代码

方式一和方式二都试过都是同样的效果

namespace hope\middleware;

use Webman\Http\Request;
use Webman\Http\Response;
use Webman\MiddlewareInterface;

class Lang implements MiddlewareInterface
{
    /**
     * @param Request $request
     * @param callable $handler
     * @return Response
     */
    public function process(Request $request, callable $handler): Response
    {
        // 方式一:通过设置session
        $session = $request->session();
        $session->set('lang', getAcceptLang());
        // 方式二:通过实时获取accept_language设置
        locale(getAcceptLang());
        var_dump(getAcceptLang());
        return $handler($request);
    }
}
验证器代码

通过手动修改语言参数translationLocale是会手动生效的(因为项目会重启),但是当第一次设置英语en参数进行接口软件APIPOST调试是可以生效的,但是第二次设置中文zh_cn参数则不生效!

  public static function getInstance(string $translationLocale = 'zh_cn'): Factory
    {
        if (null === static::$instance) {
            $translationPath = hope_path() . '/resource/translations';
            $transFileLoader = new FileLoader(new Filesystem, $translationPath);
            $translator = new Translator($transFileLoader, session('lang'));
            static::$instance = new Factory($translator);
        }

        return static::$instance;
    }

初步设想

我想是不是代码缓存了,还是通过上次请求过的参数响应结果。希望大佬们可以帮忙看看怎么回事

1213 4 0
4个回答

caylof

整个单例模式,当然是只生效第一次,目测是这个原因造成的。

  • 暂无评论
luohonen

在webman里面,不要写 getInstance 这种东西

  • 暂无评论
静默

截图
你用的单例,所以这个初始化语言代码只会执行一次,第一次是初始化的时候是 zh_cn ,那么以后所有请求都是zh_cn 了,这个应该很好理解。你应该每种语言都初始化一个instance,然后根据语言选择不同的instance

public static $instance = [];
public static function getInstance(string $translationLocale = 'zh_cn'): Factory
    {
        if (!isset(static::$instance[$translationLocale]) {
            $translationPath = hope_path() . '/resource/translations';
            $transFileLoader = new FileLoader(new Filesystem, $translationPath);
            $translator = new Translator($transFileLoader, $translationLocale);
            static::$instance[$translationLocale] = new Factory($translator);
        }

        return static::$instance[$translationLocale];
    }

这样才对

xtn

大佬 请问你是如何使用illuminate/validation的?我使用的时候报错提示A facade root has not been set.

  • 暂无评论
年代过于久远,无法发表回答
×
🔝